'auto' 作为函数参数的模板参数占位符
'auto' as a template argument placeholder for a function parameter
C++20 允许使用 auto
作为函数参数类型。
它是否也允许使用 auto
作为函数参数类型的模板参数占位符(不相似,但在某种程度上本着 的精神)?
因此,C++20 之前的代码如下:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
可以写成:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
它 does compile and works nicely 具有针对概念的实验性 GCC 实现。
它是 C++20 的合法语法吗?
相关:
此语法在 C++ 概念技术规范中有效,但在 C++20 中无效。在 C++20 概念中,auto
仅允许在函数参数类型的顶层。相关规则是 [dcl.spec.auto] paragraph 2:
A placeholder-type-specifier of the form type-constraint[opt] auto
can be used as a decl-specifier of the decl-specifier-seq of a parameter-declaration of a function declaration or lambda-expression and, if it is not the auto
type-specifier introducing a trailing-return-type (see below), is a generic parameter type placeholder of the function declaration or lambda-expression. [Note: Having a generic parameter type placeholder signifies that the function is an abbreviated function template (9.3.3.5 [dcl.fct]) or the lambda is a generic lambda (7.5.5 [expr.prim.lambda]). —end note]
(如果你在撰写本文时查看最新工作草案中的措辞,你会发现一些不同的规则。以上规则由 core issue 2447 修改,已投票进入 C+ +20 一周前在布拉格委员会会议上的最终草案。)
函数参数中的decl-specifier是参数声明开头的关键字和类型名称的初始序列。上面的规则允许 auto
在顶层:
void f(auto x);
...但仅作为 decl-specifier。嵌套在 decl-specifier:
中时不允许 auto
void f(std::vector<auto> x);
...并且在参数类型的其他地方也不允许:
void f(void (*p)(auto));
C++20 允许使用 auto
作为函数参数类型。
它是否也允许使用 auto
作为函数参数类型的模板参数占位符(不相似,但在某种程度上本着
因此,C++20 之前的代码如下:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
可以写成:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
它 does compile and works nicely 具有针对概念的实验性 GCC 实现。
它是 C++20 的合法语法吗?
相关:
此语法在 C++ 概念技术规范中有效,但在 C++20 中无效。在 C++20 概念中,auto
仅允许在函数参数类型的顶层。相关规则是 [dcl.spec.auto] paragraph 2:
A placeholder-type-specifier of the form type-constraint[opt]
auto
can be used as a decl-specifier of the decl-specifier-seq of a parameter-declaration of a function declaration or lambda-expression and, if it is not theauto
type-specifier introducing a trailing-return-type (see below), is a generic parameter type placeholder of the function declaration or lambda-expression. [Note: Having a generic parameter type placeholder signifies that the function is an abbreviated function template (9.3.3.5 [dcl.fct]) or the lambda is a generic lambda (7.5.5 [expr.prim.lambda]). —end note]
(如果你在撰写本文时查看最新工作草案中的措辞,你会发现一些不同的规则。以上规则由 core issue 2447 修改,已投票进入 C+ +20 一周前在布拉格委员会会议上的最终草案。)
函数参数中的decl-specifier是参数声明开头的关键字和类型名称的初始序列。上面的规则允许 auto
在顶层:
void f(auto x);
...但仅作为 decl-specifier。嵌套在 decl-specifier:
中时不允许auto
void f(std::vector<auto> x);
...并且在参数类型的其他地方也不允许:
void f(void (*p)(auto));