C ++ 20 permite usar o auto
tipo de parâmetro de função.
Também permite usar auto
como um espaço reservado para argumento de modelo (não semelhante, mas no espírito do modelo C ++ 17 <auto> de certa forma) para o tipo de parâmetro de função?
Portanto, o código a seguir, antes do C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Pode ser escrito como:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Ele compila e funciona bem com a implementação experimental do GCC para conceitos.
É uma sintaxe legítima com C ++ 20?
auto
se traduz diretamente em templatizadotypename XYZ
, o que implicaria fortemente que é a sintaxe legítima. Limpo .auto
é permitido entrar[](const std::pair<auto, auto>& p){}
(seja com-std=c++2a
ou-std=c++17
).Respostas:
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 :(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:... mas apenas como um especificador de declínio .
auto
não é permitido quando aninhado dentro de um especificador de declínio :... e também não é permitido em outro lugar no tipo de parâmetro:
fonte
auto
um tipo de retorno à direita contados como esse tipo deauto
uso.