为什么C++20概念与“constauto&”不兼容?
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 不工作?
回答
如[dcl.spec.auto] 中所见,当您在此处使用占位符时,约束需要紧跟在 之前auto:
占位符类型说明符:
类型constraint_选择auto
类型constraint_选择decltype ( auto )
这只是一个语法问题。约束不像是这样的一般说明符const;它没有灵活的位置。从概念上讲,您可以将其Octet auto视为代表受约束类型的一个“词”。
至于f5,这不允许作为每个 p2 的参数:
占位符型说明符的形式是“类型constraint_选择
auto”可以用作函数声明的参数声明的DECL说明符-SEQ的DECL说明符...
不存在这样的文本decltype(auto)。此外,根据 p6:
在本子条款中未明确允许的上下文中使用占位符类型的程序是格式错误的。
从逻辑上讲,我不确定如何指定decltype(auto)在这种情况下工作。当然,它可以被指定,但我认为它的语言没有先例,所以它需要被激励而不是已经具有预期效果的替代方案。