函数中的auto参数类型

时间:2015-07-27 08:37:42

标签: c++ c++14 auto c++17

我想知道标准委员会是否考虑扩展C ++ 14 auto关键字来推导出功能模板参数类型,因为它现在存在于通用lambda中。 (as can be seen nicely depicted in this answer

因为它适用于lambda函数,所以它也适用于任何函数。当然,使用经典语法完全是多余的:

template< typename T >
void f(T param);

但是能够写出这个,结果相同:

void f(auto param);

我认为可以减少代码堵塞(更短的整洁程序),并在此用例中保持一致性:

auto v = func1();
f(v);

如您所见,我们使用自动类型演化器来声明v,但是我们必须使用硬类型参数化函数f或模板化f。 结合auto,我们应该使用auto,这样会更加一致。

编辑:this question确实有效地询问了同样的事情,但不那么直接。并且还没有得到user657267给出的答案,我在其中再现和扩展。

1 个答案:

答案 0 :(得分:4)

好的,所以感谢Piotr指出另一个问题同样的问题,我发现评论中的信息可以解决这个问题,这里是:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4040.pdf

第16页,第5.1.1章命名为generic functions

  

泛型函数是一个函数模板   template-parameter-list有一个参数声明   type-specifier是auto或约束类型名称。

     

[例如:

auto f(auto x); // Ok
void sort(C& c); // Ok (assuming C names a concept)
     

- 结束示例]

这似乎相当积极:)

接下来是与所谓的普通lambda相匹配的明显措辞:

  

泛型函数的声明有一个template-parameter-list   它由一个发明的类型模板参数组成   发生了汽车。

     

[示例:以下通用函数声明是等效的:

template<typenaem T>  
conxtexpr bool C() { ... }  
auto f(auto x, const C& y);  
template<typename T1, C T2> 
auto f(T1 x, const T2& y);
     

y的类型是由C约束的类型参数。 - 结束示例]