Compartir a través de


palabra clave auto (tipo Deduction)

Deduce el tipo de una variable declarada de la expresión de inicialización.

auto declarator initializer;

Comentarios

La palabra clave de auto indica al compilador utilizar la expresión de inicialización de una variable declarada para deducir su tipo.

[!NOTA]

Antes de Visual C++ 2010, la palabra clave de auto era el especificador para la clase de almacenamiento automático.Que utilizan ahora es un error.La opción del compilador /Zc:auto, que es el valor predeterminado, indica al compilador que use el nuevo significado de la palabra clave de auto.

Recomendamos utilizar la palabra clave de auto para la mayoría situación- a menos que desee realmente conversión- porque proporciona estas ventajas:

  • Solidez: si el tipo de la expresión cambio- este incluye cuando funciona un tipo de valor devuelto de la función cambio- simplemente.

  • Se garantiza Rendimiento: You que no hay conversión.

  • Utilidad: Que no tiene que preocuparse de dificultades y de errores tipográficos de la ortografía del nombre de tipo.

  • La codificación de Eficacia: The puede ser más eficaz.

Casos de conversión en los que puede que no desee utilizar auto:

  • Si desea un tipo específico y nada hará.

  • Aplicación auxiliar de la expresión tipo- para el ejemplo, (valarray+valarray) y el inicializador lista- aunque se eligiera raramente para escribir auto x = { 1 }; };y para esperar a realmente obtener int.

Para utilizar la palabra clave de auto, utilícelo en lugar de un tipo para declarar una variable, y especifique una expresión de inicialización.Además, puede modificar la palabra clave de auto mediante especificadores y declarantes como const, volatile, puntero (*), referencia (&), y referencia (&& rvalue).El compilador evalúa la expresión de inicialización y después usa esa información para inferir el tipo de la variable.

La expresión de inicialización puede ser una asignación (la sintaxis de signo igual), una inicialización directa (sintaxis de función- estilo), o una expresión de operador nuevo.O la expresión de inicialización puede ser el parámetro de para-intervalo-declaración en una instrucción de Instrucción for basada en intervalo (C++).Para obtener más información, vea Inicializadores y ejemplos de código más adelante en este documento.

La palabra clave de auto es un marcador de posición para un tipo, pero no es en sí mismo un tipo.Por consiguiente, la palabra clave de auto no se puede utilizar en conversiones o operadores como sizeof y typeid.

Utilidad

La palabra clave de auto es una manera sencilla de declarar una variable con un tipo complejo.Por ejemplo, puede utilizar auto para declarar una variable en la expresión de inicialización implica las plantillas, punteros a funciones, o los punteros a miembros.

También puede utilizar auto para declarar e inicializar una variable a una expresión lambda.No se puede declarar el tipo de la variable personalmente porque se conoce el tipo de una expresión lambda al compilador.Para obtener más información, vea Ejemplos de expresiones lambda.

Puede utilizar auto, así como el especificador de tipo de decltype, para ayudar a escribir bibliotecas de plantilla.Utilice auto y decltype para declarar una función de plantilla cuyo tipo de valor devuelto depende de los tipos de sus argumentos.O, utilice auto y decltype declarar una función de plantilla que contenga una llamada a otra función y, a continuación devuelve lo que sea el tipo de valor devuelto de esa otra función.Para obtener más información, vea especificador de tipo decltype.

Restricciones y mensajes de error

La tabla siguiente se enumeran las restricciones en el uso de la palabra clave de auto, y el mensaje de error de diagnóstico correspondiente que el compilador emite.

Número de error

Descripción

C3530

La palabra clave de auto no se puede combinar con ningún otro tipo-especificador.

C3531

Un símbolo que se declara con la palabra clave de auto debe tener un inicializador.

C3532

Utilizó incorrectamente la palabra clave de auto para declarar un tipo.Por ejemplo, se ha declarado un tipo de valor devuelto del método o matriz.

C3533, C3539

Un argumento de parámetro o plantilla no se puede declarar con la palabra clave de auto.

C3534

Un símbolo que se declara con la palabra clave de auto en una expresión de new debe tener un inicializador.Para obtener más información, vea operator new (<new>).

C3535

Un parámetro de método o plantilla no se puede declarar con la palabra clave de auto.

C3536

Un símbolo no se puede usar antes de inicializarlo.En la práctica, esto significa que una variable no se puede usar para inicializarse a sí misma.

C3537

No se puede convertir en un tipo que se declara con la palabra clave de auto.

C3538

Todos los símbolos en un declarador muestran que se declara con la palabra clave de auto debe resolver el mismo tipo.Para obtener más información, vea Declaraciones.

C3540, C3541

Los operadores de sizeof y de typeid no se pueden aplicar a un símbolo que se declara con la palabra clave de auto.

Ejemplos

Estos fragmentos de código muestran algunas de las maneras en las que la palabra clave de auto se puede usar.

Las declaraciones siguientes son equivalentes.En la primera instrucción, j variable se declara como int escrito.En la segunda instrucción, k variable se infiere como int tipo porque la expresión de inicialización (0) es un entero.

   int j = 0;  // Variable j is explicitly type int.
   auto k = 0; // Variable k is implicitly type int because 0 is an integer.

Las declaraciones siguientes son equivalentes, pero la segunda declaración es más sencillo que la primera.Una de las razones atractivas para utilizar la palabra clave de auto es más sencilla.

   map<int,list<string>>::iterator i = m.begin(); 
   auto i = m.begin(); 

El siguiente fragmento de código se declara el tipo de variables iter y elem cuando los bucles de for y de for de intervalo comienzan.

// cl /EHsc /nologo /W4
#include <deque>
using namespace std;

int main()
{
    deque<double> dqDoubleData(10, 0.1);

    for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
    { /* ... */ }

    // prefer range-for loops with the following information in mind
    // (this applies to any range-for with auto, not just deque)

    for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
    { /* ... */ }

    for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
    { /* ... */ }

    for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
    { /* ... */ }
}

El fragmento de código siguiente utiliza la declaración del operador y el puntero de new para declarar punteros.

   double x = 12.34;
   auto *y = new auto(x), **z = new auto(&x);

El siguiente fragmento de código declara símbolos de cada instrucción de declaración.Observe que todos los símbolos en cada resolución de la instrucción el mismo tipo.

   auto x = 1, *y = &x, **z = &y; // Resolves to int.
   auto a(2.01), *b (&a);         // Resolves to double.
   auto c = 'a', *d(&c);          // Resolves to char.
   auto m = 1, &n = m;            // Resolves to int.

Este fragmento de código utiliza el operador condicional (?:) para declarar x variable como entero con un valor de 200:

   int v1 = 100, v2 = 200;
   auto x = v1 > v2 ? v1 : v2;

El fragmento de código siguiente inicializa x variable para escribir int, y variable a una referencia al tipo constint, y fp variable a un puntero a una función que devuelve el tipo int.

int f(int x) { return x; }
int main()
{
    auto x = f(0);
    const auto & y = f(1);
    int (*p)(int x);
    p = f;
    auto fp = p;
    //...
}

Vea también

Referencia

palabra clave auto

Especificadores de clase de almacenamiento

Palabras clave de C++

/Zc:auto (Deducir tipo de variable)

operador sizeof

typeid

operator new (<new>)

Declaraciones

Ejemplos de expresiones lambda

Inicializadores

especificador de tipo decltype