Hello, Is the following usage of auto proposed and evaluated:
void func(std::vector<auto> v);
It was valid in the Concepts TS, but it wasn't included in C++20 and hasn't been proposed.
I'm not sure about the syntax though, since auto everywhere else in C++ is introducing a variable. Here, it's not. array<T, auto> would make more sense, but isn't exactly in high demand.
IMHO that's why it makes sense that it wasn't taken into C++20.
(`auto` everywhere else in C++ is, kind of, introducing a variable; but I think it's also totally reasonable to think of `auto` as replacing a type T, as in `auto *f()`. So allowing it to replace the type T in `vector<T>` is defensible, if controversial. I think `vector<auto>` is vastly more defensible than `array<T, auto>`; in the latter `auto` is neither introducing a variable nor replacing a type.)
But as a practical note, it's worth mentioning that GCC has supported the Concepts-TS use of `auto` even in pre-C++20 modes since 2014.
GCC 4.9 produces a warning in -std=c++11 mode, accepts silently in -std=c++1y mode.
GCC 5, 6, 7 produce an error in -std=c++11 mode, accept silently in -std=c++14 mode.
GCC 8, 9 produce an error in -std=c++11 mode, warn in -std=c++14 and -std=c++17 modes, warn in -std=c++2a mode unless -fconcepts.
GCC 10+ produce an error in -std=c++11 mode, warn in -std=c++14 and -std=c++17 modes, accept silently in -std=c++20 mode.
Pre-C++20, this was a common stumbling block in my intro training classes: students would naturally write `auto` in the parameter list, it would compile fine for some people and not for others, and then I'd have to explain that that usage wasn't portable — yet. C++20 kind of fixed that issue, because now the construct is legal C++... except for `vector<auto>`. I'd personally prefer for GCC to just add an on-by-default warning for it in -std=c++20 mode, rather than hope it would ever be standardized, because I don't think it produces much benefit.
–Arthur