De todo el material que utilicé para aprender C ++, auto
siempre ha sido un especificador de duración de almacenamiento extraño que no tenía ningún propósito. Pero recientemente, encontré un código que lo usaba como un nombre de tipo en sí mismo. ¡Por curiosidad lo probé, y asume el tipo de lo que sea que le asigne!
De repente, los iteradores STL y, bueno, cualquier cosa que use plantillas es 10 veces más fácil de escribir. Parece que estoy usando un lenguaje 'divertido' como Python.
¿Dónde ha estado esta palabra clave toda mi vida? ¿Arruinarás mis sueños diciendo que es exclusivo de Visual Studio o no portátil?
Respuestas:
auto
era una palabra clave que C ++ "heredó" de C que había estado allí casi para siempre, pero que prácticamente nunca se usó porque solo había dos condiciones posibles: o no estaba permitida o se suponía de forma predeterminada.El uso de
auto
significar un tipo deducido era nuevo con C ++ 11.Al mismo tiempo,
auto x = initializer
deduce el tipo dex
del tipo deinitializer
la misma manera que la deducción de tipo de plantilla funciona para las plantillas de función. Considere una plantilla de función como esta:En el punto A, se ha asignado un tipo en
T
función del valor pasado para el parámetrowhatever
. Cuando lo haceauto x = initializer;
, se utiliza la misma deducción de tipo para determinar el tipox
del tipoinitializer
que se utiliza para inicializarlo.Esto significa que la mayoría de las mecánicas de deducción de tipo que un compilador necesita implementar
auto
ya estaban presentes y se utilizaron para plantillas en cualquier compilador que incluso intentó implementar C ++ 98/03. Como tal, agregar soporte paraauto
aparentemente fue bastante fácil para esencialmente todos los equipos compiladores: se agregó con bastante rapidez, y parece que también ha habido pocos errores relacionados con él.Cuando esta respuesta se escribió originalmente (en 2011, antes de que la tinta se secara en el estándar C ++ 11)
auto
ya era bastante portátil. Hoy en día, es completamente portátil entre todos los compiladores principales. Las únicas razones obvias para evitarlo serían si necesita escribir código que sea compatible con un compilador de C, o si tiene una necesidad específica de apuntar a algún compilador de nicho que sabe que no lo admite (por ejemplo, algunas personas aún escriben código para MS-DOS usando compiladores de Borland, Watcom, etc., que no han visto actualizaciones significativas en décadas). Si está utilizando una versión razonablemente actual de cualquiera de los compiladores principales, no hay razón para evitarla.fuente
Simplemente toma una palabra clave generalmente inútil y le da una nueva y mejor funcionalidad. Es estándar en C ++ 11, y la mayoría de los compiladores de C ++ con incluso cierta compatibilidad con C ++ 11 lo admitirán.
fuente
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
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 imaginariatemplate<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ónauto i = 0, d = 0.0;
está mal formada, mientras que la declaraciónauto 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
fuente
Esta funcionalidad no ha estado allí toda su vida. Ha sido compatible con Visual Studio desde la versión 2010. Es una nueva característica de C ++ 11, por lo que no es exclusiva de Visual Studio y es / será portátil. La mayoría de los compiladores ya lo admiten.
fuente
No va a ninguna parte ... es una nueva característica estándar de C ++ en la implementación de C ++ 11. Dicho esto, si bien es una herramienta maravillosa para simplificar las declaraciones de objetos, así como para limpiar la sintaxis de ciertos paradigmas de llamadas (es decir, bucles for basados en rangos), no lo use en exceso ni lo abuse :-)
fuente
La palabra clave auto especifica que el tipo de la variable que se declara se deducirá automáticamente de su inicializador. En el caso de las funciones, si su tipo de retorno es automático, entonces se evaluará mediante la expresión de tipo de retorno en tiempo de ejecución.
Puede ser muy útil cuando tenemos que usar el iterador. Por ejemplo, para el siguiente código, simplemente podemos usar el "auto" en lugar de escribir la sintaxis completa del iterador.
Así es como podemos usar la palabra clave "auto"
fuente
Es mágico es su capacidad de reducir la necesidad de escribir código para cada tipo de variable que se pasa a funciones específicas. Considere una función similar a Python print () en su base C.
fuente