从this question开始,很明显auto
不能用作函数参数。我的问题是为什么返回类型允许为auto
但函数参数不是?
auto function(auto data)
{
//DOES something
}
由于there有auto
进入 c ++ 1z 的好处,那么为什么不呢?
答案 0 :(得分:12)
这个语法是在概念TS中提出的,它没有进入various reasons的C ++ 17。
尽管我在下面概述了一些批评,但它已在C ++ 20中添加。
注意:通过将P1141R2合并到标准中,以下部分答案已经过时。我会把它留在这里作为参考。
然而,即使我们最终在下一次迭代中获得Concepts(可能是C ++ 20),也不清楚所需的语法是否会成为标准。在this paper中,Richard Smith和James Dennett批评所谓的“Terse模板符号”,说
概念TS为函数模板声明引入了太多语法。其中一些语法没有清晰,一致的模板语法标记,这对于代码的读者来说是重要的语义信息(记住代码的读取远远超过它的编写)。
他们继续提出不同的语法来实现目标,同时保持模板声明更加一致:
=>需要一个明确的sigil来声明一个函数作为模板
替换
void f(auto a) {} template<typename T> void g(auto a) {}
与
template<...> void f(auto a) {} template<typename T, ...> void g(auto a) {}
template-parameter-list 中的... sigil表示 其他模板参数将从声明中推断出来。
所以 Tl; dr :有很多原因与标准化程序有关,为什么我们在C ++ 17中没有它,并且我们可能不会有更多理由永远得到它。如果我正确理解了论文,关键是应该使用template
关键字引入每个模板。
答案 1 :(得分:6)
已经有了一个详尽的答案,我只是想通过给出更多的回答来增加我的两分钱......
通常auto
不代表“这可以是任何类型”,但它只是意味着编译器可以推断出类型。
auto
auto function(auto data) {
//...
return x;
}
完全不同。单独看到这个定义,编译器可以推断出返回类型。另一方面,除非编译器看到auto
的调用方式,否则无法推导出参数function
。此外,需要有function
的不同版本。虽然找出x
的类型几乎是微不足道的,但要使第二个auto
工作需要将function
转换为需要新规则的模板,并且不可避免地会引入新的语言怪癖。