Tenga en cuenta que esta pregunta se publicó originalmente en 2009, antes de que se ratificara C ++ 11 y antes de que el significado de la
auto
palabra clave cambiara drásticamente. Las respuestas proporcionadas pertenecen solo al significado de C ++ 03 deauto
- que es una clase de almacenamiento especificada - y no al significado de C ++ 11 deauto
- que es la deducción automática de tipos. Si está buscando un consejo sobre cuándo utilizar C ++ 11auto
, esta pregunta no es relevante para esa pregunta.
Durante mucho tiempo pensé que no había razón para usar la static
palabra clave en C, porque las variables declaradas fuera del alcance del bloque eran implícitamente globales. Luego descubrí que declarar una variable como static
dentro del alcance del bloque le daría una duración permanente, y declararla fuera del alcance del bloque (en el alcance del programa) le daría el alcance del archivo (solo se puede acceder en esa unidad de compilación).
Así que esto me deja con una sola palabra clave que (quizás) todavía no entiendo completamente: la auto
palabra clave. ¿Tiene algún otro significado que no sea "variable local"? ¿Algo que hace que no se haga implícitamente para usted donde quiera que desee usarlo? ¿Cómo se auto
comporta una variable en el alcance del programa? ¿Qué pasa con una static auto
variable en el ámbito del archivo? ¿Tiene esta palabra clave algún otro propósito que no sea simplemente existir para completar ?
En C ++ 11,
auto
tiene un nuevo significado: le permite deducir automáticamente el tipo de una variable.¿Por qué es eso útil? Consideremos un ejemplo básico:
std::list<int> a; // fill in a for (auto it = a.begin(); it != a.end(); ++it) { // Do stuff here }
El
auto
no crea un iterador de tipostd::list<int>::iterator
.Esto puede hacer que un código realmente complejo sea mucho más fácil de leer.
Otro ejemplo:
int x, y; auto f = [&]{ x += y; }; f(); f();
Allí,
auto
dedujeron el tipo requerido para almacenar una expresión lambda en una variable. Wikipedia tiene una buena cobertura sobre el tema.fuente
const auto it = a.begin();
te daría una constanteiterator
, no unaconst_iterator
. Aún podría cambiar el elemento, pero++it
fallaría al compilar. Para obtener unconst_iterator
, usaríaauto it = a.cbegin();
La palabra clave auto no tiene ningún propósito en este momento. Tiene exactamente razón en que simplemente reafirma la clase de almacenamiento predeterminada de una variable local, siendo la alternativa realmente útil
static
.Tiene un significado completamente nuevo en C ++ 0x. ¡Eso te da una idea de lo inútil que fue!
fuente
GCC tiene un uso especial de
auto
para funciones anidadas; consulte aquí .Si tiene una función anidada que desea llamar antes de su definición, debe declararla con
auto
.fuente
"auto" supuestamente le dice al compilador que decida por sí mismo dónde colocar la variable (memoria o registro). Su análogo es "registro", que supuestamente le dice al compilador que intente mantenerlo en un registro. Los compiladores modernos ignoran ambos, por lo que usted también debería hacerlo.
fuente
Utilizo esta palabra clave para documentar explícitamente cuando es fundamental para la función, que la variable se coloque en la pila, para procesadores basados en pila. Esta función puede ser necesaria cuando se modifica la pila antes de regresar de una función (o interrumpir la rutina de servicio). En este caso declaro:
auto unsigned int auiStack[1]; //variable must be on stack
Y luego accedo fuera de la variable:
#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;
Entonces, la
auto
palabra clave ayuda a documentar la intención.fuente
Según Stroustrup, en "El lenguaje de programación C" (cuarta edición, que cubre C 11), el uso de 'auto' tiene las siguientes razones principales (sección 2.2.2) (se citan las palabras de Stroustrup):
1)
¡Con 'auto' y su inicializador necesario podemos conocer el tipo de variable de un vistazo!
2)
En mi opinión un caso que encaja aquí, es algo como esto:
double square(double d) { return d*d; } int square(int d) { return d*d; } auto a1 = square(3); cout << a1 << endl; a1 = square(3.3); cout << a1 << endl;
3)
Imagine un nombre de tipo largo de un iterador con plantilla:
(código de la sección 6.3.6.1)
template<class T> void f1(vector<T>& arg) { for (typename vector<T>::iterator p = arg.begin(); p != arg.end(); p) *p = 7; for (auto p = arg.begin(); p != arg.end(); p) *p = 7; }
fuente
En el compilador antiguo, auto era una forma de declarar una variable local. No puede declarar variables locales en compiladores antiguos como Turbo C sin la palabra clave auto o algo así.
fuente
El nuevo significado de la palabra clave auto en C ++ 0x se describe muy bien por Stephan T. Lavavej de Microsoft en una conferencia en video sobre STL que se puede ver / descargar libremente que se encuentra en el sitio del Canal 9 de MSDN aquí. .
Vale la pena ver la conferencia en su totalidad, pero la parte sobre la palabra clave auto está aproximadamente en el minuto 29 (aproximadamente).
fuente
¿Hay algún otro significado para 'auto' que no sea 'variable local'?
No en C ++ 03.
¿Algo que hace que no se haga implícitamente para usted donde quiera que desee usarlo?
Nada en absoluto, en C ++ 03.
¿Cómo se comporta una variable automática en el ámbito del programa? ¿Qué pasa con una variable automática estática en el alcance del archivo?
Palabra clave no permitida fuera del cuerpo de una función / método.
¿Tiene esta palabra clave algún propósito [en C ++ 03] que no sea simplemente existir para completar?
Sorprendentemente, sí. Los criterios de diseño de C ++ incluían un alto grado de compatibilidad con versiones anteriores de C. C tenía esta palabra clave y no había ninguna razón real para prohibirla o redefinir su significado en C ++. Entonces, el propósito era una incompatibilidad menos con C.
¿Esta palabra clave tiene algún propósito en C que no sea simplemente existir para completar?
Aprendí uno solo recientemente: la facilidad para portar programas antiguos de B. C evolucionó a partir de un lenguaje llamado B cuya sintaxis era bastante similar a la de C. Sin embargo, B no tenía ningún tipo. La única forma de declarar una variable en B era especificar su tipo de almacenamiento (
auto
oextern
). Me gusta esto:Esta sintaxis todavía funciona en C y es equivalente a
porque en C, la clase de almacenamiento es predeterminada
auto
y el tipo es predeterminadoint
. Supongo que todos los programas que se originaron en B y se portaron a C estaban literalmente llenos deauto
variables en ese momento.C ++ 03 ya no permite el int implícito del estilo C, pero conservó la
auto
palabra clave que ya no es exactamente útil porque, a diferencia del int implícito, no se sabía que causara ningún problema en la sintaxis de C.fuente