Esta sintaxis es válida en la Especificación técnica de conceptos de C ++, pero no en C ++ 20. En los conceptos de C ++ 20, auto
solo se permite en el nivel superior en un tipo de parámetro de función. La regla relevante es [dcl.spec.auto] párrafo 2 :
Un especificador de tipo de marcador de posición de la restricción de tipo de formulario [opt] auto
puede usarse como un especificador de declinación de la seq-especificador de declinación de una declaración de parámetro de una declaración de función o expresión lambda y, si no es el auto
El especificador de tipo que introduce un tipo de retorno final (ver más abajo) es un marcador de posición de tipo de parámetro genérico de la declaración de función o expresión lambda. [Nota: Tener un marcador de posición de tipo de parámetro genérico significa que la función es una plantilla de función abreviada (9.3.3.5 [dcl.fct]) o que la lambda es una lambda genérica (7.5.5 [expr.prim.lambda]). —Nota final]
(Si marca la redacción en el borrador de trabajo más reciente al momento de escribir, encontrará una regla algo diferente. La regla anterior fue modificada por el tema central 2447 , que fue votado en el borrador final de C ++ 20 en Praga reunión del comité hace una semana.)
Los especificadores de declinación en un parámetro de función son la secuencia inicial de palabras clave y nombres de tipo al comienzo de la declaración del parámetro. La regla anterior permite auto
allí en el nivel superior:
void f(auto x);
... pero solo como un especificador de declinación . auto
no está permitido cuando está anidado dentro de un especificador de declinación :
void f(std::vector<auto> x);
... y tampoco está permitido en otra parte del tipo de parámetro:
void f(void (*p)(auto));
auto
se traduce directamente en plantillatypename XYZ
, lo que implicaría que es la sintaxis legítima. Aseado .