template<typename T>
concept Octet = 1 == sizeof(T);
// ok
Octet decltype(auto) c = 'a';
// ok
void f1(const auto&) {}
// ok
void f2(Octet auto) {}
// ok
void f3(Octet auto&&) {}
// error: expected ‘auto’ or ‘decltype(auto)’ after ‘Octet’
void f4(Octet const auto&) {}
// error: cannot declare a parameter with ‘decltype(auto)’
void f5(Octet decltype(auto)) {}用gcc-11 -std=c++20编译。请参阅:https://godbolt.org/z/xK769Pfjn
f4 和 f5 为什么不工作?
发布于 2021-05-07 18:32:43
正如在[dcl.spec.auto]中看到的,当您在这里使用占位符时,约束需要紧接在auto之前。
占位符-类型-说明符: 类型约束选择
auto类型约束选择decltype ( auto )
这只是一个语法问题。约束不是像const那样的通用说明符;它没有灵活的位置。从概念上讲,您可以将Octet auto看作一个表示受约束类型的“单词”。
至于f5,这不允许作为p2的参数:
一个占位符-类型说明符的形式“类型约束_选择
auto”可以用作一个函数声明的参数声明的decl-说明符-seq的decl-说明符.
decltype(auto)不存在这样的文本。此外,每个p6:
在此子子句中不显式允许的上下文中使用占位符类型的程序格式不正确。
从逻辑上讲,我不确定如何指定decltype(auto)在此上下文中工作。当然,它可以被指定,但我不认为它的语言有先例,所以它需要被激发到一个已经达到预期效果的替代方案上。
https://stackoverflow.com/questions/67439885
复制相似问题