Ami*_*rsh 25 c++ templates auto c++20
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;
}
Run Code Online (Sandbox Code Playgroud)
可以写成:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Run Code Online (Sandbox Code Playgroud)
它确实可以编译并与概念的实验性 GCC 实现一起很好地工作。
它是 C++20 的合法语法吗?
Ric*_*ith 19
此语法在 C++ 概念技术规范中有效,但在 C++20 中无效。在 C++20 概念中,auto只允许在函数参数类型的顶层。相关规则是[dcl.spec.auto] 第 2 段:
甲占位符型说明符形式的类型约束[选择]
auto可以被用作一个DECL说明符的的DECL说明符-SEQ一个的参数声明函数声明或λ-表达,如果它不是auto类型说明符引入尾随返回类型(见下文),是函数声明或lambda 表达式的泛型参数类型占位符. [注意:具有泛型参数类型占位符表示该函数是缩写的函数模板 (9.3.3.5 [dcl.fct]) 或 lambda 是泛型 lambda (7.5.5 [expr.prim.lambda])。——尾注]
(如果您在撰写本文时查看最新工作草案中的措辞,您会发现有些不同的规则。上述规则由核心问题 2447修改,该问题已在布拉格会议上投票进入 C++20 最终草案一周前的委员会会议。)
该DECL说明符S IN的函数的参数是关键字,类型名称在参数声明的开始的初始序列。上述规则允许auto在顶层:
void f(auto x);
Run Code Online (Sandbox Code Playgroud)
...但仅作为声明说明符。auto嵌套在decl-specifier 中时不允许:
void f(std::vector<auto> x);
Run Code Online (Sandbox Code Playgroud)
...并且在参数类型的其他地方也不允许:
void f(void (*p)(auto));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |