自动作为功能参数的模板参数

问题描述 投票:4回答:2

C ++ 20允许将auto用于功能参数类型。

是否还允许在函数参数类型的模板参数上使用auto(与C ++ 17 in a way中一样?

因此,下面的代码在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++ templates auto c++20
2个回答
3
投票

此语法在C ++概念技术规范中有效,但在C ++ 20中无效。在C ++ 20概念中,auto仅在函数参数类型的顶层被允许。相关规则是[dcl.spec.auto] paragraph 2

形式为[[type-constraint [opt] auto

A placeholder-type-specifier可以用作decl-specifier-seq]的decl-specifier函数声明或lambda-expressionparameter-declaration的>,如果不是auto type-specifier,则引入trailing-return-type (请参见下文)是函数声明或lambda-expression通用参数类型占位符。 [注意:具有通用参数类型占位符表示该函数是缩写的函数模板(9.3.3.5 [dcl.fct])或lambda是通用lambda(7.5.5 [expr.prim.lambda])。 —尾注]

((如果您在撰写本文时检查了最新工作草案中的措辞,您会发现一条稍有不同的规则。上述规则已由core issue 2447修改,并在[]中被选入C ++ 20最终草案。一周前的布拉格委员会会议。)
函数参数中的

decl-specifier

s是参数声明开始处的关键字和类型名称的初始序列。上面的规则允许auto位于顶层:void f(auto x);
...,但仅作为

decl-specifier

。当嵌套在decl-specifier
中时,不允许autovoid f(std::vector<auto> x);
...,并且在参数类型的其他地方也不允许:

void f(void (*p)(auto));

© www.soinside.com 2019 - 2024. All rights reserved.