'auto' 作为函数参数的模板参数占位符

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 的合法语法吗?


相关:C++ 概念的通配符说“接受这个模板参数的任何东西”

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)

  • @LF:无论如何,CWG 问题并不真正相关:它纠正了一个措辞错误,该错误暗示尾随返回类型的某些“auto”用法被视为这种“auto”用法。 (4认同)