![](/img/trans.png)
[英]auto in function parameter list implying template argument
[英]'auto' as a template argument placeholder for a function parameter
C++20 允许对函数参数类型使用auto
。
是否还允许使用auto
作为函数参数类型的模板参数占位符(不相似,但在某种程度上符合C++17 template<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;
}
它确实可以编译并与概念的实验性 GCC 实现一起很好地工作。
它是 C++20 的合法语法吗?
此语法在 C++ 概念技术规范中有效,但在 C++20 中无效。 在 C++20 概念中,仅允许在函数参数类型的顶层使用auto
。 相关规则是[dcl.spec.auto] 第 2 段:
形式类型约束的一个占位符型说明符[选择]
auto
可以用作函数声明或λ表达式组成的参数声明的DECL说明符-SEQ的DECL说明符,并且如果它是不引入尾随返回类型(见下文)的auto
类型说明符是函数声明或lambda 表达式的泛型参数类型占位符。 [注意:具有泛型参数类型占位符表示该函数是缩写的函数模板 (9.3.3.5 [dcl.fct]) 或 lambda 是泛型 lambda (7.5.5 [expr.prim.lambda])。 ——尾注]
(如果你在撰写本文时查看最近的工作草案中的措辞,你会发现有些不同的规则。上述规则由核心问题 2447修改,该问题在布拉格会议上投票成为 C++20 最终草案一周前的委员会会议。)
函数参数中的decl-specifier是参数声明开头的关键字和类型名称的初始序列。 上面的规则允许auto
在顶层:
void f(auto x);
...但仅作为声明说明符。 嵌套在声明说明符中时不允许使用auto
:
void f(std::vector<auto> x);
...并且在参数类型的其他地方也不允许:
void f(void (*p)(auto));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.