为什么 C++20 概念与 "const auto&" 不兼容?

Why is the C++20 concept not compatible with "const auto&"?

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:

之前

placeholder-type-specifier:
type-constraint_opt auto
type-constraint_opt decltype ( auto )

这只是一个语法问题。约束不是像 const 这样的一般说明符;它没有灵活的位置。从概念上讲,您可以将 Octet auto 视为代表受约束类型的一个“词”。

至于 f5,每个 p2 不允许将其作为参数:

A placeholder-type-specifier of the form "type-constraint_opt auto" can be used as a decl-specifier of the decl-specifier-seq of a parameter-declaration of a function declaration...

decltype(auto) 不存在这样的文本。此外,根据第 6 页:

A program that uses a placeholder type in a context not explicitly allowed in this subclause is ill-formed.

从逻辑上讲,我不确定如何指定 decltype(auto) 在此上下文中工作。当然,它 可以 被指定,但我不认为它的语言有先例,所以它需要被激励而不是已经具有预期效果的替代方案。