推导的模板参数和自动参数之间有什么区别吗?

Is there any difference between a deduced template arg and auto arg?

这两个函数是否有任何有意义的不同?有什么理由普遍偏爱其中之一吗?

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

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

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

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

就我个人而言,和您一样,我更喜欢第一个,因为它不需要打字而且更容易阅读。


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

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

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

是不正确的,因为 xy 不需要在 #2 中具有相同的类型,这与 #1.

不同

按字面定义是等价的[dcl.fct]

An abbreviated function template is a function declaration that has one or more generic parameter type placeholders. An abbreviated function template is equivalent to a function template whose template-parameter-list includes one invented type template-parameter for each generic parameter type placeholder of the function declaration, in order of appearance.

其中 泛型占位符 auto.

与大多数等效语法一样,它归结为惯例:选择一个并坚持使用。

Are these two functions different in any meaningful way?

是的。后者比前者造成更多的重复性压力伤害,尤其是因为用头敲击键盘既是重复性的,又是 injury-inducing.

很多软件工程都是关于处理人类的局限性和需求,而不是机器。甚至看似 machine-centric 性能等方面也只在某些人可能关心的范围内才重要(是那些想要更流畅体验的用户,或者那些身体不会再进行另一轮走廊剑斗的开发人员,或者当像 Facebook 这样规模的人看到他们的基础设施性能下降 1% 时,股东们会盗汗——在这种规模上,损失是用金滚珠轴承从大漏斗的喷口自由落下来衡量的。

几乎 Ada-like 冗长,整个 template 周围的语法都陷入其中,这至少不符合人体工程学。人体工程学在一天结束时让我们开心起着重要作用,所以是的,从字面意义上讲,它肯定是有意义的。这对编译器来说意义不大,但按照这个标准,我们将使用盲文打孔器直接以 2^6 为基数编写机器代码:机器的任意性对我们来说不一定是任意的!