Essa sintaxe é válida na Especificação técnica dos conceitos do C ++, mas não no C ++ 20. Nos conceitos do C ++ 20, auto
é permitido apenas no nível superior em um tipo de parâmetro de função. A regra relevante é o [dcl.spec.auto] parágrafo 2 :
Um especificador de tipo de espaço reservado da restrição de tipo de formulário [opt] auto
pode ser usado como um especificador de declínio do decl-specifier-seq de uma declaração de parâmetro de uma declaração de função ou expressão lambda e, se não for o auto
O especificador de tipo que introduz um tipo de retorno à direita (veja abaixo) é um espaço reservado de tipo de parâmetro genérico da declaração da função ou expressão lambda. [Nota: Ter um espaço reservado genérico para o tipo de parâmetro significa que a função é um modelo de função abreviado (9.3.3.5 [dcl.fct]) ou o lambda é um lambda genérico (7.5.5 [expr.prim.lambda]). - end note]
(Se você verificar a redação do rascunho de trabalho mais recente no momento da redação deste documento, encontrará uma regra um pouco diferente. A regra acima foi modificada pela edição principal 2447 , que foi votada na minuta final do C ++ 20 em Praga. reunião do comitê há uma semana.)
O especificador de declínio s em um parâmetro de função é a sequência inicial de palavras-chave e nomes de tipos no início da declaração do parâmetro. A regra acima permite auto
que no nível superior:
void f(auto x);
... mas apenas como um especificador de declínio . auto
não é permitido quando aninhado dentro de um especificador de declínio :
void f(std::vector<auto> x);
... e também não é permitido em outro lugar no tipo de parâmetro:
void f(void (*p)(auto));
auto
se traduz diretamente em templatizadotypename XYZ
, o que implicaria fortemente que é a sintaxe legítima. Limpo .