为什么 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)
在此上下文中工作。当然,它 可以 被指定,但我不认为它的语言有先例,所以它需要被激励而不是已经具有预期效果的替代方案。
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_optauto
type-constraint_optdecltype ( 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)
在此上下文中工作。当然,它 可以 被指定,但我不认为它的语言有先例,所以它需要被激励而不是已经具有预期效果的替代方案。