为什么不允许自动作为函数参数?

Why auto is not allowed as function argument?

本文关键字:函数 参数 不允许 为什么      更新时间:2023-10-16

从这个问题中,很明显auto不能用作函数参数。我的问题是为什么允许返回类型作为auto而函数参数不允许?

auto function(auto data)
{
//DOES something
}

既然c++1zauto有很多好处,那么为什么不呢?

这种语法是在 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变成一个模板,这需要新的规则,并且不可避免地会给语言带来新的怪癖。