繁体   English   中英

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

[英]'auto' as a template argument placeholder for a function parameter

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

确实可以编译并与概念的实验性 GCC 实现一起很好地工作

它是 C++20 的合法语法吗?


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

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

形式类型约束的一个占位符型说明符[选择] auto可以用作函数声明或λ表达式组成的参数声明DECL说明符-SEQDECL说明符,并且如果它是不引入尾随返回类型(见下文)的auto类型说明是函数声明或lambda 表达式泛型参数类型占位符 [注意:具有泛型参数类型占位符表示该函数是缩写的函数模板 (9.3.3.5 [dcl.fct]) 或 lambda 是泛型 lambda (7.5.5 [expr.prim.lambda])。 ——尾注]

(如果你在撰写本文时查看最近的工作草案中的措辞,你会发现有些不同的规则。上述规则由核心问题 2447修改,该问题在布拉格会议上投票成为 C++20 最终草案一周前的委员会会议。)

函数参数中的decl-specifier是参数声明开头的关键字和类型名称的初始序列。 上面的规则允许auto在顶层:

void f(auto x);

...但仅作为声明说明符 嵌套在声明说明符中时不允许使用auto

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

...并且在参数类型的其他地方也不允许:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM