Compartilhar via


palavra-chave (tipo de dedução) auto

Deduz o tipo da variável declarada de sua expressão de inicialização.

auto declarator initializer;

Comentários

A palavra-chave de auto direciona o compilador para usar a expressão de inicialização de uma variável declarada para deduzir o tipo.

ObservaçãoObservação

Antes de Visual C++ 2010, a palavra-chave de auto foi o especificador para armazenamento classe automático.Esse uso é agora um erro.A opção de compilador /Zc:auto , que é a opção informa que o compilador, para usar o novo significado de palavras-chave de auto .

É recomendável que você use a palavra-chave de auto para a maioria situação- a menos que você deseje que realmente fornece conversão- porque esses benefícios:

  • Robustez: se o tipo da expressão mudam - isto inclui quando um tipo de retorno da função mudam - ele funciona muito.

  • VocêDesempenho: é garantido que não haverá conversão.

  • Usabilidade: você não tem que se preocupar sobre dificuldades e tipográficos erros de ortografia do nome do tipo.

  • Eficiência: a codificação pode ser mais eficiente.

Caso de conversão em que você pode não querer usar auto:

  • Quando você deseja um tipo específico e fará nada mais.

  • Auxiliar de modelo de expressões de tipo para o exemplo, o (valarray+valarray) e o inicializador lista- embora raramente você escolhesse para escrever auto x = { 1 }; };e para o esperar realmente obter int.

Para usar a palavra-chave de auto , use em vez de um tipo para declarar uma variável, e especifica uma expressão de inicialização.Além disso, você pode alterar a palavra-chave de auto usando especificadores e declarators como const, volatile, o ponteiro*(), a referência (&), e a referência (&&de rvalue).O compilador avalia a expressão e então utiliza de inicialização essas informações deduzir o tipo da variável.

A expressão de inicialização pode ser uma atribuição (sintaxe do sinal de igualdade), uma inicialização direta (sintaxe de gerenciamento de função estilo), ou uma expressão de operador novo .Ou a expressão de inicialização pode ser o parâmetro de para-intervalo-declaração em uma instrução de Instrução for com base em intervalo (C++) .Para obter mais informações, consulte Inicializadores e exemplos de código posteriormente neste documento.

A palavra-chave de auto é um espaço reservado para um tipo, mas não é um tipo.Como consequência, a palavra-chave de auto não pode ser usado nas conversões ou nos operadores como sizeof e typeID.

Utilidade

A palavra-chave de auto é uma maneira simples para declarar uma variável que tenha um tipo complexo.Por exemplo, você pode usar auto para declarar uma variável onde a expressão de inicialização quebra modelos, ponteiros para funções, ou ponteiros para membros.

Você também pode usar auto para declarar e inicializar uma variável em uma expressão lambda.Você não pode declarar o tipo de variável você mesmo porque o tipo de uma expressão lambda é conhecido somente para o compilador.Para obter mais informações, consulte Exemplos de expressões Lambda.

Você pode usar auto, juntamente com o especificador de tipo de decltype , para ajudar a escrever bibliotecas de modelo.Use auto e decltype para declarar uma função de modelo cujo tipo de retorno depende dos tipos dos argumentos do modelo.Ou, use auto e decltype declarar uma função do modelo que envolve uma chamada a outra função, e então retorna o que é o tipo de retorno de outra função.Para obter mais informações, consulte Especificador de tipo decltype.

Restrições e mensagens de erro

A tabela a seguir lista as limitações no uso da palavra-chave de auto , e a mensagem de erro correspondente de diagnóstico que o compilador emite se.

Número de erro

Descrição

C3530

A palavra-chave de auto não pode ser combinado com nenhum especificador de tipo.

C3531

Um símbolo que é declarado com a palavra-chave de auto deve ter um inicializador.

C3532

Você usou incorretamente a palavra-chave de auto para declarar um tipo.Por exemplo, você declarou um tipo de retorno do método ou uma matriz.

C3533, C3539

Um argumento de parâmetro ou modelo não pode ser declarado com a palavra-chave de auto .

C3534

Um símbolo que é declarado com a palavra-chave de auto em uma expressão de new deve ter um inicializador.Para obter mais informações, consulte operator new (<new>).

C3535

Um parâmetro do método ou de modelo não pode ser declarado com a palavra-chave de auto .

C3536

Um símbolo não pode ser usado antes de ser inicializado.Na prática, isso significa que uma variável não pode ser usado para se inicializar.

C3537

Você não pode converter para um tipo que é declarado com a palavra-chave de auto .

C3538

Todos os números em um declarator listam que é declarado com a palavra-chave de auto deve resolver o mesmo tipo.Para obter mais informações, consulte Declarações.

C3540, C3541

Operadores de sizeof e de typeID não podem ser aplicados a um símbolo que é declarado com a palavra-chave de auto .

Exemplos

Esses fragmentos de código a seguir ilustram algumas das maneiras em que a palavra-chave de auto pode ser usado.

As seguintes declarações são equivalentes.Na primeira instrução, j variável é declarada para ser inttipo.Na segunda instrução, k variável é para ser deduzido tipo int porque a expressão de inicialização (0) é um número inteiro.

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

As seguintes declarações são equivalentes, mas a segunda declaração é mais simples do que a primeira.Um dos motivos simples de usar a palavra-chave de auto é simplicidade.

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

O fragmento de código a seguir declarar o tipo de variáveis iter e elem quando o início de loop de for e de for do intervalo.

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

O fragmento de código a seguir usa a declaração do operador e ponteiro de new para declarar ponteiros.

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

O fragmento de código a seguir declara vários símbolos em cada instrução de declaração.Observe que todos os símbolos em cada declaração resolvem ao mesmo 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.

O fragmento de código a seguir usa o operador condicional?:() para declarar x variável como um número inteiro que tem um valor de 200:

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

O fragmento de código a seguir inicializa x variável para o tipo int, y variável a uma referência para o tipo constint, e fp variável para um ponteiro para uma função que retorna o 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;
    //...
}

Consulte também

Referência

palavra-chave auto

Especificadores de classe de armazenamento

Palavras-chave C++

/ZC:auto (deduzir o tipo de variável)

Operador sizeof

typeID

operator new (<new>)

Declarações

Exemplos de expressões Lambda

Inicializadores

Especificador de tipo decltype