C ++ 20 permite usar el auto
tipo de parámetro de función.
¿También permite usar auto
como un marcador de posición de argumento de plantilla (no similar, pero en el espíritu de la plantilla C ++ 17 <auto> de alguna manera) para el tipo de parámetro de función?
Entonces, el siguiente código, pre C ++ 20:
template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
std::cout << p.first << ", " << p.second;
}
Podría escribirse como:
void printPair(const std::pair<auto, auto>& p) {
std::cout << p.first << ", " << p.second;
}
Se hace de compilación y funciona muy bien con la implementación experimental para GCC conceptos.
¿Es una sintaxis legítima con C ++ 20?
auto
se traduce directamente en plantillatypename XYZ
, lo que implicaría que es la sintaxis legítima. Aseado .auto
está permitido[](const std::pair<auto, auto>& p){}
(ya sea con-std=c++2a
o-std=c++17
).Respuestas:
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 :(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:... pero solo como un especificador de declinación .
auto
no está permitido cuando está anidado dentro de un especificador de declinación :... y tampoco está permitido en otra parte del tipo de parámetro:
fuente
auto
un tipo de retorno final contaban como este tipo deauto
uso.