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çã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 |
---|---|
A palavra-chave de auto não pode ser combinado com nenhum especificador de tipo. |
|
Um símbolo que é declarado com a palavra-chave de auto deve ter um inicializador. |
|
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. |
|
Um argumento de parâmetro ou modelo não pode ser declarado com a palavra-chave de auto . |
|
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>). |
|
Um parâmetro do método ou de modelo não pode ser declarado com a palavra-chave de auto . |
|
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. |
|
Você não pode converter para um tipo que é declarado com a palavra-chave de auto . |
|
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. |
|
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
Especificadores de classe de armazenamento