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)) {}
Compiled with gcc-11 -std=c++20
. See: https://godbolt.org/z/xK769Pfjn
Why do f4
and f5
not work?
C++ auto auto, const, and references It can be modified with the const keyword and the & symbol to represent a const type or a reference type, respectively. These modifiers can be combined.
Let's define a few concepts in this post. A concept can be defined by a function template or by a variable template. A variable template is new with C++14 and declares a family of variables. If you use a function template for your concept, it's called a function concept; in the second case a variable concept.
As seen in [dcl.spec.auto], when you use a placeholder here, the constraint needs to immediately precede the auto
:
placeholder-type-specifier:
type-constraint_optauto
type-constraint_optdecltype ( auto )
This is simply a matter of syntax. The constraint isn't a general specifier like const
is; it doesn't have a flexible position. Conceptually, you can think of Octet auto
as one "word" representing the constrained type.
As for f5
, this is not allowed as a parameter per 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...
No such text exists for decltype(auto)
. In addition, per p6:
A program that uses a placeholder type in a context not explicitly allowed in this subclause is ill-formed.
Logically, I'm not sure how I'd specify decltype(auto)
to work in this context. Sure, it could be specified, but I don't think there's precedent in the language for it, so it would need to be motivated over an alternative that already has the desired effect.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With