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_opt auto
type-constraint_opt decltype ( 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.