为什么不允许auto作为函数参数?

时间:2017-08-11 10:27:41

标签: c++ c++17

this question开始,很明显auto不能用作函数参数。我的问题是为什么返回类型允许为auto但函数参数不是?

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

由于thereauto进入 c ++ 1z 的好处,那么为什么不呢?

2 个答案:

答案 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转换为需要新规则的模板,并且不可避免地会引入新的语言怪癖。