C++20 allows using auto
for function parameter type.
Does it also allow using auto
as a template argument placeholder (not similar, but in the spirit of C++17 template<auto> in a way) for function parameter type?
So the following code, pre C++20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Could be written as:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
It does compile and works nicely with experimental GCC implementation for concepts.
Is it a legitimate syntax with C++20?
This syntax is valid in the C++ Concepts Technical Specification, but not in C++20. In C++20 concepts,
auto
is only permitted at the top level in a function parameter type. The relevant rule is [dcl.spec.auto] paragraph 2:(If you check the wording in the most recent working draft at the time of writing, you will find a somewhat different rule. The above rule was modified by core issue 2447, which was voted into the C++20 final draft at the Prague committee meeting a week ago.)
The decl-specifiers in a function parameter are the initial sequence of keywords and type names at the start of the parameter declaration. The above rule allows
auto
there at the top level:... but only as a decl-specifier.
auto
is not permitted when nested within a decl-specifier:... and is also not permitted elsewhere in the parameter type: