自动作为函数参数的模板参数占位符

问题描述 投票:9回答:1

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;
}

does compile and works nicely具有实验性GCC实施概念。

在C ++ 20中是合法语法吗?

c++ templates auto c++20
1个回答
9
投票
形式为[[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

中时,不允许auto

void f(std::vector<auto> x);

...,并且在参数类型的其他地方也不允许:void f(void (*p)(auto));
© www.soinside.com 2019 - 2024. All rights reserved.