【问题标题】:'auto' as a template argument placeholder for a function parameter'auto' 作为函数参数的模板参数占位符
【发布时间】:2020-06-07 00:49:53
【问题描述】:

C++20 允许使用auto 作为函数参数类型。

是否还允许将auto 用作函数参数类型的模板参数占位符(不相似,但在某种程度上符合C++17 template<auto> 的精神)?

所以下面的代码,pre 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 的合法语法吗?


相关:Wildcard for C++ concepts saying "accepting anything for this template argument"

【问题讨论】:

  • 据我所知,不受约束的auto 直接 转换为模板化的typename XYZ,这强烈暗示它是合法的语法。 整洁.
  • 请注意,Clang disagrees 和 Clang 和 GCC 对于 [](const std::pair&lt;auto, auto&gt;&amp; p){} 中是否允许使用 auto 存在相同的分歧(无论是 -std=c++2a 还是 -std=c++17)。
  • 谢谢@DavisHerring - 我已经修正了措辞

标签: c++ templates auto c++20


【解决方案1】:

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

type-constraint[opt] auto 形式的 placeholder-type-specifier 可以用作 decl-specifier decl-specifier-seqparameter-declaration 的函数声明或 lambda-expression,如果不是 @987654326 @type-specifier引入了一个trailing-return-type(见下文),是函数声明的泛型参数类型占位符lambda 表达式。 [注意:具有泛型参数类型占位符表示该函数是一个缩写函数模板 (9.3.3.5 [dcl.fct]) 或 lambda 是一个泛型 lambda (7.5.5 [expr.prim.lambda])。 ——尾注]

(如果你在撰写本文时查看最新的工作草案中的措辞,你会发现有些不同的规则。上面的规则是由core issue 2447修改的,它被投票进入了C++20最终草案在一周前的布拉格委员会会议上。)

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

void f(auto x);

...但仅作为 decl-specifierauto 嵌套在 decl-specifier 中时是不允许的:

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

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

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

【讨论】:

  • 哇,我不知道! CWG 链接目前给出 404,那么您能简要解释一下这个限制的理由吗?
  • 抱歉,CWG 问题及其措辞更改尚未公开显示。有问题的规则是由 open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1141r2.html 引入的,其意图/基本原理是与我们已经允许的通用 lambdas 一致。
  • @LF:无论如何,CWG 问题并不真正相关:它更正了一个措辞错误,暗示将auto 用于尾随返回类型的某些用途算作这种auto 用法。
  • 这就是为什么 gcc 吃掉我的代码但 clang 拒绝的原因。
猜你喜欢
  • 1970-01-01
  • 2016-04-08
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2011-08-26
相关资源
最近更新 更多