首页 > 解决方案 > 推导的模板 arg 和自动 arg 之间有什么区别吗?

问题描述

这两个功能在任何有意义的方面有什么不同吗?有什么理由通常更喜欢一个而不是另一个?

void foo(auto x, auto &... y) { /* ... */ }

template<typename T, typename... Tx>
void foo(T x, Tx &... y) { /* ... */ }

当我不需要 T 类型时,我倾向于使用第一个,因为它更短……但我想知道是否有任何缺点。

标签: c++templatesc++20template-argument-deduction

解决方案


在所示示例中,两个版本之间绝对没有区别。两者都是不受约束的函数模板,它们按值采用 1 个任何类型的参数,然后按引用采用 0 个或多个任何类型的参数。

就个人而言,和你一样,我更喜欢第一个,因为它打字更少,更容易阅读。


用一种形式替换另一种形式时需要小心,例如:

template<typename T>
void foo(T x, T y) { /* ... */ }  // #1

void foo(auto x, auto y) { /* ... */ }  // #2 // not equivalent to #1

是不正确的,因为与 in 不同,不需要xy具有相同的类型。#2#1


推荐阅读