为什么不允许自动作为函数参数?
Why auto is not allowed as function argument?
从这个问题中,很明显auto
不能用作函数参数。我的问题是为什么允许返回类型作为auto
而函数参数不允许?
auto function(auto data)
{
//DOES something
}
既然c++1z中auto
有很多好处,那么为什么不呢?
这种语法是在 TS 概念中提出的,由于各种原因没有进入 C++17。
尽管我在下面概述了一些批评,但它已被添加到 C++20 中。
注意:答案的以下部分已通过合并P1141R2到标准中而过时。我将把它留在这里以供参考。
然而,即使我们最终在下一次迭代(可能是C++20(中得到了概念,也不清楚所需的语法是否会成为标准。在这篇论文中,理查德·史密斯和詹姆斯·丹尼特批评了所谓的"简洁模板符号">,他说
概念 TS 为函数模板声明引入了太多语法。其中一些语法没有清晰、一致的模板语法标记,这对于代码的读者来说是重要的语义信息(请记住,代码的阅读量远远超过编写的代码量(。
他们继续提出不同的语法来实现目标,同时保持模板声明更加一致:
=> 需要一个显式符号来声明函数为模板
取代
void f(auto a) {} template<typename T> void g(auto a) {}
跟
template<...> void f(auto a) {} template<typename T, ...> void g(auto a) {}
这。。。模板参数列表中的符号表示 将从声明中推断出其他模板参数。
所以tl;DR:有很多原因与标准化程序有关,为什么我们在C++17中没有它,还有更多的原因为什么我们可能永远不会得到它。如果我正确理解了这篇论文,关键点是每个模板都应该用一个template
关键字来介绍。
已经有一个详尽的答案,我只想通过给出一个更手挥手的答案来增加我的两分钱......
一般来说,auto
并不代表"这可能是任何类型",而只是意味着编译器可以推断出该类型。因此,两个auto
auto function(auto data) {
//...
return x;
}
完全不同。仅看到此定义,编译器就可以推断返回类型。另一方面,除非编译器看到如何调用function
,否则无法推断参数的auto
。此外,需要有不同版本的function
.虽然弄清楚x
的类型几乎是微不足道的,但要做第二auto
工作需要function
变成一个模板,这需要新的规则,并且不可避免地会给语言带来新的怪癖。
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数