Этот синтаксис действителен в Технической спецификации концепций C ++, но не в C ++ 20. В концепциях C ++ 20 autoдопускается только на верхнем уровне в типе параметра функции. Соответствующее правило - [dcl.spec.auto] параграф 2 :
Заполнитель типа Спецификатор вид типа-ограничение [отказ] autoможет быть использован в качестве ДЕЦЛИ-спецификатор в ДЕЦЛЕ-спецификаторе-SEQ о наличии параметра-декларации в объявлении функции или лямбда-выражении , и, если это не auto спецификатор типа, представляющий тип конечного возврата (см. ниже), является родовым заполнителем типа параметра объявления функции или лямбда-выражения, [Примечание: Наличие заполнителя универсального типа параметра означает, что функция является сокращенным шаблоном функции (9.3.3.5 [dcl.fct]) или лямбда является универсальной лямбда (7.5.5 [expr.prim.lambda]). —Конечная записка]
(Если вы проверите формулировку в самом последнем рабочем проекте на момент написания, вы найдете несколько иное правило. Вышеупомянутое правило было изменено основным вопросом 2447 , который был утвержден в окончательном варианте C ++ 20 в Праге. заседание комитета неделю назад.)
Спецификатор decl s в параметре функции является начальной последовательностью ключевых слов и имен типов в начале объявления параметра. Приведенное выше правило позволяет autoна верхнем уровне:
void f(auto x);
... но только как спецификатор decl . autoне допускается, если вложен в спецификатор decl :
void f(std::vector<auto> x);
... и также не разрешено где-либо еще в типе параметра:
void f(void (*p)(auto));
autoнапрямую переводится в шаблонизированныйtypename XYZ, что сильно подразумевает, что это законный синтаксис. Ухоженная .