函数中的自动参数类型
auto parameter type in functions
我想知道标准委员会是否考虑扩展 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 给出的答案,我在下面复制和扩展。
好的,感谢 Piotr 指出了另一个问题,询问同样的事情,我在评论中找到了可以解决这个问题的信息,这里是:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4040.pdf
第 16 页,第 5.1.1 章名为 generic functions
A generic function is a function template whose
template-parameter-list has a parameterdeclaration whose
type-specifier is either auto or a constrained-type-name.
[ Example:
auto f(auto x); // Ok
void sort(C& c); // Ok (assuming C names a concept)
— end example ]
这似乎很积极:)
后跟预期的明显措辞,匹配通用 lambda:
The declaration of a generic function has a template-parameter-list
that consists of one invented type template-parameter for each
occurrence of auto.
[ Example: The following generic function declarations are equivalent:
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);
The type of y is a type parameter constrained by C. — end example ]
我想知道标准委员会是否考虑扩展 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 给出的答案,我在下面复制和扩展。
好的,感谢 Piotr 指出了另一个问题,询问同样的事情,我在评论中找到了可以解决这个问题的信息,这里是:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4040.pdf
第 16 页,第 5.1.1 章名为 generic functions
A generic function is a function template whose template-parameter-list has a parameterdeclaration whose type-specifier is either auto or a constrained-type-name.
[ Example:
auto f(auto x); // Ok void sort(C& c); // Ok (assuming C names a concept)
— end example ]
这似乎很积极:)
后跟预期的明显措辞,匹配通用 lambda:
The declaration of a generic function has a template-parameter-list that consists of one invented type template-parameter for each occurrence of auto.
[ Example: The following generic function declarations are equivalent:
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);
The type of y is a type parameter constrained by C. — end example ]