Para las variables, especifica que el tipo de la variable que se declara se deducirá automáticamente de su inicializador. Para funciones, especifica que el tipo de retorno es un tipo de retorno final o se deducirá de sus declaraciones de retorno (desde C ++ 14).
Sintaxis
auto variable initializer (1) (since C++11)
auto function -> return type (2) (since C++11)
auto function (3) (since C++14)
decltype(auto) variable initializer (4) (since C++14)
decltype(auto) function (5) (since C++14)
auto :: (6) (concepts TS)
cv(optional) auto ref(optional) parameter (7) (since C++14)
Explicación
1) Al declarar variables en el alcance del bloque, en el alcance del espacio de nombres, en las declaraciones de inicialización de bucles for, etc., la palabra clave auto se puede usar como el especificador de tipo. Una vez que se ha determinado el tipo de inicializador, el compilador determina el tipo que reemplazará la palabra clave auto usando las reglas para la deducción de argumentos de plantilla a partir de una llamada de función (ver deducción de argumentos de plantilla # Otros contextos para más detalles). La palabra clave auto puede estar acompañada de modificadores, como const o &, que participarán en la deducción de tipo. Por ejemplo, dado const auto& i = expr;
, el tipo de i es exactamente el tipo del argumento u en una plantilla imaginaria template<class U> void f(const U& u)
si la función llamaf(expr)
fue compilado Por lo tanto, auto && puede deducirse como una referencia de valor o una referencia de valor de acuerdo con el inicializador, que se utiliza en el rango para el bucle. Si se usa auto para declarar múltiples variables, los tipos deducidos deben coincidir. Por ejemplo, la declaración auto i = 0, d = 0.0;
está mal formada, mientras que la declaración auto i = 0, *p = &i;
está bien formada y el auto se deduce como int.
2) En una declaración de función que utiliza la sintaxis de tipo de retorno final, la palabra clave auto no realiza la detección automática de tipo. Solo sirve como parte de la sintaxis.
3) En una declaración de función que no utiliza la sintaxis de tipo de retorno final, la palabra clave auto indica que el tipo de retorno se deducirá del operando de su declaración de retorno utilizando las reglas para la deducción de argumentos de plantilla.
4) Si el tipo declarado de la variable es decltype (auto), la palabra clave auto se reemplaza con la expresión (o lista de expresiones) de su inicializador, y el tipo real se deduce usando las reglas para decltype.
5) Si el tipo de retorno de la función se declara decltype (auto), la palabra clave auto se reemplaza con el operando de su declaración return, y el tipo de retorno real se deduce usando las reglas para decltype.
6) Un especificador de nombre anidado de la forma auto :: es un marcador de posición que se reemplaza por una clase o tipo de enumeración que sigue las reglas para la deducción de marcador de posición de tipo restringido.
7) Una declaración de parámetro en una expresión lambda. (desde C ++ 14) Una declaración de parámetro de función. (conceptos TS)
Notas
Hasta C ++ 11, auto tenía la semántica de un especificador de duración de almacenamiento. Mezclar variables automáticas y funciones en una declaración, como en auto f() -> int, i = 0;
no está permitido.
Para más información: http://en.cppreference.com/w/cpp/language/auto