从这个问题来看,很明显auto不能用作函数参数.我的问题是为什么允许返回类型,auto但函数参数不是?
auto function(auto data)
{
//DOES something
}
Run Code Online (Sandbox Code Playgroud)
既然,进入c ++ 1z 会有很多好处,那么为什么不呢?auto
Bau*_*gen 12
这种语法是在概念TS中提出的,由于各种原因,它没有进入C++ 17 .
尽管我在下面概述了一些批评,但它已经在C++ 20中添加了.
注意:通过将P1141R2合并到标准中,以下部分答案已经过时.我会留在这里供参考.
但是,即使我们最终在下一次迭代(可能是C++ 20)中获得了Concepts,也不清楚所需的语法是否会成为标准.在本文中,理查德史密斯和詹姆斯丹尼特批评所谓的"Terse模板符号",说
Concepts TS为函数模板声明引入了太多语法.其中一些语法没有清晰,一致的模板语法标记,这对于代码的读者来说是重要的语义信息(记住代码的读取远远超过它的编写).
他们继续提出不同的语法来实现目标,同时保持模板声明更加一致:
=>需要一个显式的sigil来声明一个函数作为模板
更换
Run Code Online (Sandbox Code Playgroud)void f(auto a) {} template<typename T> void g(auto a) {}同
Run Code Online (Sandbox Code Playgroud)template<...> void f(auto a) {} template<typename T, ...> void g(auto a) {}该...印记在模板参数列表表明,额外的模板参数会从声明中推断出来.
所以Tl;博士:有很多与标准化程序相关的原因,为什么我们在C++ 17中没有它,并且有更多的理由我们可能永远不会得到它.如果我正确理解了论文,关键点在于应该使用template关键字引入每个模板.
已经有一个详尽的答案,我只是想通过给出一个更加手写的答案来增加我的两分钱......
通常auto不代表"这可以是任何类型",但它只是意味着编译器可以推断出类型.因此两个人auto在
auto function(auto data) {
//...
return x;
}
Run Code Online (Sandbox Code Playgroud)
是完全不同的.单独看到这个定义,编译器可以推断出返回类型.另一方面,auto除非编译器看到如何function调用,否则无法推导出参数.而且,需要有不同的版本function.虽然弄清楚其类型几乎是微不足道的x,但第二项auto工作需要function变成一个需要新规则的模板,并不可避免地为语言引入新的怪癖.
| 归档时间: |
|
| 查看次数: |
1777 次 |
| 最近记录: |