auto (C++)auto (C++)

Deduce el tipo de una variable declarada a partir de su expresión de inicialización.Deduces the type of a declared variable from its initialization expression.

Nota

El estándar de C++ define un significado original y otro revisado para esta palabra clave.The C++ standard defines an original and a revised meaning for this keyword. Antes de Visual Studio 2010, la auto palabra clave declara una variable en la clase de almacenamiento automático , es decir, una variable que tiene una duración local.Before Visual Studio 2010, the auto keyword declares a variable in the automatic storage class; that is, a variable that has a local lifetime. A partir de Visual Studio 2010, la auto palabra clave declara una variable cuyo tipo se deduce de la expresión de inicialización en su declaración.Starting with Visual Studio 2010, the auto keyword declares a variable whose type is deduced from the initialization expression in its declaration. La opción del compilador /Zc:auto[ ] controla el significado de la auto palabra clave.The /Zc:auto[-] compiler option controls the meaning of the auto keyword.

SintaxisSyntax

auto***inicializador* *declarador***;auto declarator initializer ;

[](auto***parám1* , auto *parám2***) {};[](auto param1 , auto param2 ) {};

ObservacionesRemarks

La auto palabra clave indica al compilador que utilice la expresión de inicialización de una variable declarada o un parámetro de expresión lambda para deducir su tipo.The auto keyword directs the compiler to use the initialization expression of a declared variable, or lambda expression parameter, to deduce its type.

Se recomienda usar la auto palabra clave para la mayoría de las situaciones, a menos que desee realmente una conversión, ya que proporciona estas ventajas:We recommend that you use the auto keyword for most situations—unless you really want a conversion—because it provides these benefits:

  • Solidez: Si se cambia el tipo de la expresión (esto incluye cuando se cambia un tipo de valor devuelto de función), solo funciona.Robustness: If the expression’s type is changed—this includes when a function return type is changed—it just works.

  • Rendimiento: Se garantiza que no habrá conversión.Performance: You’re guaranteed that there will be no conversion.

  • Facilidad de uso: No tiene que preocuparse por las dificultades de ortografía y los errores tipográficos.Usability: You don't have to worry about type name spelling difficulties and typos.

  • Eficiencia: La codificación puede ser más eficaz.Efficiency: Your coding can be more efficient.

Casos de conversión en los que es posible que no desee usar auto :Conversion cases in which you might not want to use auto:

  • Cuando se desea un tipo específico y es la única alternativa.When you want a specific type and nothing else will do.

  • Tipos de aplicación auxiliar de plantilla de expresión: por ejemplo, (valarray+valarray) .Expression template helper types—for example, (valarray+valarray).

Para usar la auto palabra clave, úsela en lugar de un tipo para declarar una variable y especifique una expresión de inicialización.To use the auto keyword, use it instead of a type to declare a variable, and specify an initialization expression. Además, puede modificar la auto palabra clave mediante especificadores y declaradores como const , volatile , puntero ( * ), referencia ( & ) y referencia a valor r ( && ).In addition, you can modify the auto keyword by using specifiers and declarators such as const, volatile, pointer (*), reference (&), and rvalue reference (&&). El compilador evalúa la expresión de inicialización y emplea esa información para deducir el tipo de la variable.The compiler evaluates the initialization expression and then uses that information to deduce the type of the variable.

La auto expresión de inicialización puede adoptar varias formas:The auto initialization expression can take several forms:

  • Sintaxis de inicialización universal, como auto a { 42 }; .Universal initialization syntax, such as auto a { 42 };.
  • Sintaxis de asignación, como auto b = 0; .Assignment syntax, such as auto b = 0;.
  • Sintaxis de asignación universal, que combina los dos formularios anteriores, como auto c = { 3.14156 }; .Universal assignment syntax, which combines the two previous forms, such as auto c = { 3.14156 };.
  • Inicialización directa o sintaxis de tipo constructor, como auto d( 1.41421f ); .Direct initialization, or constructor-style syntax, such as auto d( 1.41421f );.

Para obtener más información, vea inicializadores y los ejemplos de código más adelante en este documento.For more information, see Initializers and the code examples later in this document.

Cuando auto se utiliza para declarar el parámetro de bucle en una instrucción basada en intervalo for , se usa una sintaxis de inicialización diferente, por ejemplo for (auto& i : iterable) do_action(i); .When auto is used to declare the loop parameter in a range-based for statement, it uses a different initialization syntax, for example for (auto& i : iterable) do_action(i);. Para obtener más información, vea instrucción basada en intervalo for (C++).For more information, see Range-based for Statement (C++).

La auto palabra clave es un marcador de posición para un tipo, pero no es un tipo.The auto keyword is a placeholder for a type, but it is not itself a type. Por consiguiente, la auto palabra clave no se puede usar en conversiones u operadores como sizeof y (para C++/CLI) typeid .Therefore, the auto keyword cannot be used in casts or operators such as sizeof and (for C++/CLI) typeid.

UtilidadUsefulness

La auto palabra clave es una forma sencilla de declarar una variable que tiene un tipo complejo.The auto keyword is a simple way to declare a variable that has a complicated type. Por ejemplo, puede utilizar auto para declarar una variable en la que la expresión de inicialización implique plantillas, punteros a funciones o punteros a miembros.For example, you can use auto to declare a variable where the initialization expression involves templates, pointers to functions, or pointers to members.

También puede usar auto para declarar e inicializar una variable en una expresión lambda.You can also use auto to declare and initialize a variable to a lambda expression. No puede declarar el tipo de la variable porque solo el compilador conoce el tipo de una expresión lambda.You can't declare the type of the variable yourself because the type of a lambda expression is known only to the compiler. Para obtener más información, vea ejemplos de expresiones lambda.For more information, see Examples of Lambda Expressions.

Tipos de valor devuelto finalesTrailing Return Types

Puede usar auto , junto con el decltype especificador de tipo, para ayudar a escribir bibliotecas de plantillas.You can use auto, together with the decltype type specifier, to help write template libraries. Utilice auto y decltype para declarar una función de plantilla cuyo tipo de valor devuelto depende de los tipos de sus argumentos de plantilla.Use auto and decltype to declare a template function whose return type depends on the types of its template arguments. O bien, use auto y decltype para declarar una función de plantilla que contenga una llamada a otra función y, a continuación, devuelva el tipo de valor devuelto de esa otra función.Or, use auto and decltype to declare a template function that wraps a call to another function, and then returns whatever is the return type of that other function. Para obtener más información, vea decltype.For more information, see decltype.

Referencias y calificadores cvReferences and cv-qualifiers

Tenga en cuenta que el uso de auto gotas de referencias, const calificadores y volatile calificadores.Note that using auto drops references, const qualifiers, and volatile qualifiers. Considere el ejemplo siguiente:Consider the following example:

// cl.exe /analyze /EHsc /W4
#include <iostream>

using namespace std;

int main( )
{
    int count = 10;
    int& countRef = count;
    auto myAuto = countRef;

    countRef = 11;
    cout << count << " ";

    myAuto = 12;
    cout << count << endl;
}

En el ejemplo anterior, he auto es int , no una int referencia, por lo que la salida es 11 11 , no 11 12 como sería el caso si el calificador de referencia no se ha quitado auto .In the previous example, myAuto is an int, not an int reference, so the output is 11 11, not 11 12 as would be the case if the reference qualifier had not been dropped by auto.

Deducción de tipos con inicializadores entre llaves (C++ 14)Type deduction with braced initializers (C++14)

En el ejemplo de código siguiente se muestra cómo inicializar una auto variable mediante llaves.The following code example shows how to initialize an auto variable using braces. Observe la diferencia entre B y C y entre A y E.Note the difference between B and C and between A and E.

#include <initializer_list>

int main()
{
    // std::initializer_list<int>
    auto A = { 1, 2 };

    // std::initializer_list<int>
    auto B = { 3 };

    // int
    auto C{ 4 };

    // C3535: cannot deduce type for 'auto' from initializer list'
    auto D = { 5, 6.7 };

    // C3518 in a direct-list-initialization context the type for 'auto'
    // can only be deduced from a single initializer expression
    auto E{ 8, 9 };

    return 0;
}

Restricciones y mensajes de errorRestrictions and Error Messages

En la tabla siguiente se enumeran las restricciones del uso de la auto palabra clave y el mensaje de error de diagnóstico correspondiente que emite el compilador.The following table lists the restrictions on the use of the auto keyword, and the corresponding diagnostic error message that the compiler emits.

Número de errorError number DescripciónDescription
C3530C3530 La auto palabra clave no se puede combinar con ningún otro especificador de tipo.The auto keyword cannot be combined with any other type-specifier.
C3531C3531 Un símbolo que se declara con la auto palabra clave debe tener un inicializador.A symbol that is declared with the auto keyword must have an initializer.
C3532C3532 Ha utilizado incorrectamente la auto palabra clave para declarar un tipo.You incorrectly used the auto keyword to declare a type. Por ejemplo, declaró un tipo de valor devuelto de método o una matriz.For example, you declared a method return type or an array.
C3533, C3539C3533, C3539 Un parámetro o un argumento de plantilla no se pueden declarar con la auto palabra clave.A parameter or template argument cannot be declared with the auto keyword.
C3535C3535 Un método o un parámetro de plantilla no se puede declarar con la auto palabra clave.A method or template parameter cannot be declared with the auto keyword.
C3536C3536 No se puede usar un símbolo antes de inicializarlo.A symbol cannot be used before it is initialized. En la práctica, esto significa que una variable no se puede usar para inicializarse a sí misma.In practice, this means that a variable cannot be used to initialize itself.
C3537C3537 No se puede convertir a un tipo que se declara con la auto palabra clave.You cannot cast to a type that is declared with the auto keyword.
C3538C3538 Todos los símbolos de una lista de declaradores que se declara con la auto palabra clave deben resolverse en el mismo tipo.All the symbols in a declarator list that is declared with the auto keyword must resolve to the same type. Para obtener más información, vea declaraciones y definiciones.For more information, see Declarations and Definitions.
C3540, C3541C3540, C3541 Los operadores sizeof y typeid no se pueden aplicar a un símbolo declarado con la auto palabra clave.The sizeof and typeid operators cannot be applied to a symbol that is declared with the auto keyword.

EjemplosExamples

Estos fragmentos de código muestran algunas de las formas en que auto se puede usar la palabra clave.These code fragments illustrate some of the ways in which the auto keyword can be used.

Las declaraciones siguientes son equivalentes.The following declarations are equivalent. En la primera instrucción, la variable j se declara como de int tipo.In the first statement, variable j is declared to be type int. En la segunda instrucción, k se deduce que la variable es de tipo int porque la expresión de inicialización (0) es un entero.In the second statement, variable k is deduced to be type int because the initialization expression (0) is an integer.

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 sencilla que la primera.The following declarations are equivalent, but the second declaration is simpler than the first. Uno de los motivos más atractivos para usar la auto palabra clave es la simplicidad.One of the most compelling reasons to use the auto keyword is simplicity.

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

En el fragmento de código siguiente se declara el tipo de variables iter y elem Cuándo se for for inician los bucles de intervalos y.The following code fragment declares the type of variables iter and elem when the for and range for loops start.

// 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
    { /* ... */ }
}

En el fragmento de código siguiente new se usa el operador y la declaración de puntero para declarar punteros.The following code fragment uses the new operator and pointer declaration to declare pointers.

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

En el fragmento de código siguiente se declaran varios símbolos en cada instrucción de declaración.The next code fragment declares multiple symbols in each declaration statement. Observe que todos los símbolos de cada instrucción se resuelven en el mismo tipo.Notice that all of the symbols in each statement resolve to the same type.

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.

En este fragmento de código se utiliza el operador condicional (?:) para declarar la variable x como un entero que tiene un valor de 200:This code fragment uses the conditional operator (?:) to declare variable x as an integer that has a value of 200:

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

En el fragmento de código siguiente se inicializa la variable x en el tipo int , la variable y en una referencia al tipo const int y fp la variable en un puntero a una función que devuelve el tipo int .The following code fragment initializes variable x to type int, variable y to a reference to type const int, and variable fp to a pointer to a function that returns type 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;
    //...
}

Consulte tambiénSee also

Palabras claveKeywords
/Zc:auto (Deducir tipo de variable)/Zc:auto (Deduce Variable Type)
sizeof Operatorsizeof Operator
typeid
operator new
Declaraciones y definicionesDeclarations and Definitions
Ejemplos de expresiones lambdaExamples of Lambda Expressions
InicializadoresInitializers
decltype