'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));