Observe que esta questão foi postada originalmente em 2009, antes que C ++ 11 fosse ratificado e antes que o significado da
auto
palavra - chave fosse drasticamente alterado. As respostas fornecidas referem-se apenas ao significado de C ++ 03auto
- sendo uma classe de armazenamento especificada - e não ao significado de C ++ 11auto
- de dedução automática de tipo. Se você está procurando conselhos sobre quando usar o C ++ 11auto
, esta questão não é relevante para aquela questão.
Por muito tempo, pensei que não havia razão para usar a static
palavra - chave em C, porque as variáveis declaradas fora do escopo do bloco eram implicitamente globais. Então descobri que declarar uma variável como static
dentro do escopo do bloco daria a ela uma duração permanente, e declarar fora do escopo do bloco (no escopo do programa) daria a ela o escopo do arquivo (só pode ser acessado naquela unidade de compilação).
Portanto, isso me deixa com apenas uma palavra-chave que eu (talvez) ainda não entendo completamente: a auto
palavra-chave. Existe algum outro significado para isso além de 'variável local?' Alguma coisa que ele faz que não seja implicitamente feito para você, onde quer que você queira usá-lo? Como uma auto
variável se comporta no escopo do programa? O que dizer de uma static auto
variável no escopo do arquivo? Esta palavra-chave tem outra finalidade além de apenas ser completa ?
Em C ++ 11,
auto
tem um novo significado: permite deduzir automaticamente o tipo de uma variável.Por que isso é sempre útil? Vamos considerar um exemplo básico:
std::list<int> a; // fill in a for (auto it = a.begin(); it != a.end(); ++it) { // Do stuff here }
O
auto
lá cria um iterador do tipostd::list<int>::iterator
.Isso pode tornar alguns códigos seriamente complexos muito mais fáceis de ler.
Outro exemplo:
int x, y; auto f = [&]{ x += y; }; f(); f();
Lá, o
auto
deduziu o tipo necessário para armazenar uma expressão lambda em uma variável. A Wikipedia tem uma boa cobertura sobre o assunto.fonte
const auto it = a.begin();
daria a você um constiterator
, não umconst_iterator
. Você ainda deve alterar o elemento, mas++it
não conseguirá compilar. Para obter umconst_iterator
, você usariaauto it = a.cbegin();
A palavra-chave auto não tem propósito no momento. Você está exatamente certo ao dizer que apenas reafirma a classe de armazenamento padrão de uma variável local, sendo a alternativa realmente útil
static
.Ele tem um novo significado em C ++ 0x. Isso dá a você uma ideia de como era inútil!
fonte
O GCC tem um uso especial
auto
para funções aninhadas - veja aqui .Se você tiver uma função aninhada que deseja chamar antes de sua definição, será necessário declará-la com
auto
.fonte
"auto" supostamente diz ao compilador para decidir por si mesmo onde colocar a variável (memória ou registro). Seu análogo é o "registro", que supostamente diz ao compilador para tentar mantê-lo em um registro. Compiladores modernos ignoram ambos, então você também deve.
fonte
Eu uso esta palavra-chave para documentar explicitamente quando é crítico para a função, que a variável seja colocada na pilha, para processadores baseados em pilha. Esta função pode ser necessária ao modificar a pilha antes de retornar de uma função (ou interromper a rotina de serviço). Neste caso, declaro:
auto unsigned int auiStack[1]; //variable must be on stack
E então eu acesso fora da variável:
#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;
Portanto, a
auto
palavra - chave ajuda a documentar a intenção.fonte
De acordo com Stroustrup, em "The C Programming Language" (4ª Edição, cobrindo C 11), o uso de 'auto' tem as seguintes razões principais (seção 2.2.2) (palavras de Stroustrup são citadas):
1)
Com 'auto' e seu inicializador necessário podemos saber o tipo da variável em um piscar de olhos!
2)
Na minha opinião um caso que se encaixa aqui é algo assim:
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 algum nome de tipo longo de um iterador com modelo:
(código da seção 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; }
fonte
No compilador antigo, auto era uma forma de declarar uma variável local. Você não pode declarar variáveis locais em compiladores antigos como Turbo C sem a palavra-chave auto ou algo parecido.
fonte
O novo significado da palavra-chave auto em C ++ 0x é descrito muito bem por Stephan T. Lavavej da Microsoft em uma palestra em vídeo que pode ser visualizada / baixada gratuitamente no STL, encontrada no site Channel 9 do MSDN aqui .
A palestra vale a pena assistir na íntegra, mas a parte sobre a palavra-chave auto está por volta da marca de 29 minutos (aproximadamente).
fonte
Existe algum outro significado para 'auto' diferente de 'variável local?'
Não em C ++ 03.
Alguma coisa que ele faz que não seja implicitamente feito para você, onde quer que você queira usá-lo?
Absolutamente nada, em C ++ 03.
Como uma variável automática se comporta no escopo do programa? O que dizer de uma variável automática estática no escopo do arquivo?
Palavra-chave não permitida fora de um corpo de função / método.
Esta palavra-chave tem algum propósito [em C ++ 03] além de apenas existir para ser completo?
Surpreendentemente, sim. Os critérios de design do C ++ incluíam um alto grau de compatibilidade com versões anteriores de C. C tinha essa palavra-chave e não havia razão real para bani-la ou redefinir seu significado em C ++. Portanto, o objetivo era uma incompatibilidade a menos com C.
Essa palavra-chave tem algum propósito em C além de apenas existir para ser completo?
Aprendi um apenas recentemente: facilidade de portar programas antigos de B. C evoluiu de uma linguagem chamada B, cuja sintaxe era bastante semelhante à de C. No entanto, B não tinha nenhum tipo. A única maneira de declarar uma variável em B era especificar seu tipo de armazenamento (
auto
ouextern
). Como isso:Esta sintaxe ainda funciona em C e é equivalente a
porque em C, o padrão da classe de armazenamento é
auto
, e o padrão do tipo éint
. Acho que cada programa originado em B e portado para C estava literalmente cheio deauto
variáveis naquela época.C ++ 03 não permite mais o int implícito do estilo C, mas preservou a
auto
palavra - chave não mais exatamente útil porque, ao contrário do int implícito, não era conhecido por causar nenhum problema na sintaxe de C.fonte