本文介绍了'auto' 作为函数参数的模板参数占位符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

C++20 允许对函数参数类型使用 auto.

是否还允许使用 auto 作为模板参数占位符(不相似,但本着 C++17 模板 以某种方式)用于函数参数类型?

所以下面的代码,在 C++20 之前:

templatevoid printPair(const std::pair<First, Second>& p) {std::cout <<p.first <<"、"<<p.second;}

可以写成:

void printPair(const std::pair& p) {std::cout <<p.first <<"、"<<p.second;}

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

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


解决方案

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

type-constraint[opt] auto 形式的 placeholder-type-specifier 可以用作 decl-函数声明的参数声明decl-specifier-seq的说明符lambda表达式,如果它不是引入 trailing-return-type(见下文)的 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);

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

void f(std::vector x);

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

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

C++20 allows using auto for function parameter type.

Does it also allow using auto as a template argument placeholder (not similar, but in the spirit of C++17 template<auto> in a way) for function parameter type?

So the following code, pre C++20:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
    std::cout << p.first << ", " << p.second;
}

Could be written as:

void printPair(const std::pair<auto, auto>& p) {
    std::cout << p.first << ", " << p.second;
}

It does compile and works nicely with experimental GCC implementation for concepts.

Is it a legitimate syntax with C++20?


解决方案

This syntax is valid in the C++ Concepts Technical Specification, but not in C++20. In C++20 concepts, auto is only permitted at the top level in a function parameter type. The relevant rule is [dcl.spec.auto] paragraph 2:

(If you check the wording in the most recent working draft at the time of writing, you will find a somewhat different rule. The above rule was modified by core issue 2447, which was voted into the C++20 final draft at the Prague committee meeting a week ago.)

The decl-specifiers in a function parameter are the initial sequence of keywords and type names at the start of the parameter declaration. The above rule allows auto there at the top level:

void f(auto x);

... but only as a decl-specifier. auto is not permitted when nested within a decl-specifier:

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

... and is also not permitted elsewhere in the parameter type:

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

这篇关于'auto' 作为函数参数的模板参数占位符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-06 09:12