Motivação e armadilhas (?) Da palavra-chave automática em C ++ 11

20

Recentemente, eu estava me perguntando por que a palavra-chave autofoi escolhida no C ++ 11 para marcar uma variável cujo tipo deve ser inferido pelo compilador, como em

auto x = 1;

Desde a

  1. var parece mais comum em outras linguagens de programação (por exemplo, C #, Scala, JavaScript) e
  2. Pelo que entendi, a nova semântica das autoquebras de compatibilidade com versões anteriores (raramente era usada, mas tinha um significado diferente nas revisões anteriores do C ++, veja, por exemplo, aqui )

Eu queria perguntar se havia um motivo especial para escolher auto(a favor varou qualquer outra palavra-chave). Houve alguma discussão específica sobre esse problema antes do lançamento do padrão C ++ 11?

Além disso, existem possíveis incompatibilidades que devemos observar ao recompilar o código C ++ herdado com um compilador C ++ 11?

Giorgio
fonte
9
A nova semântica de autopode quebrar a compatibilidade com versões anteriores, mas, dependendo da frequência com que varé usado como nome de variável em comparação com a frequência com que a autopalavra-chave é usada no código anterior ao 11, o comitê pode ter opinado que quebra a compatibilidade de maneira menos dramática do que a introdução de um novo palavra-chave faria.
sepp2k
2
"Atualmente, essa questão não é adequada para o nosso formato de perguntas e respostas. Esperamos que as respostas sejam apoiadas por fatos, referências ou conhecimentos específicos, mas essa pergunta provavelmente solicitará debate, argumentos, pesquisas ou discussão prolongada. Se você acha que essa pergunta pode ser aprimorada e possivelmente reaberta, consulte as Perguntas frequentes para obter orientações. ": Esta pergunta está perguntando sobre um fato: houve uma discussão sobre esse tópico. Existem duas respostas possíveis: SIM e NÃO.
Giorgio
2
Claro que houve uma discussão, o que torna a pergunta meio inútil a esse respeito. A pergunta autovs varé a que 90% do seu texto se refere e essa pergunta não tem resultado definitivo. (embora eu não sou o único que votou para fechar)
Telastyn
1
@Telastyn: Se eu soubesse que houve uma discussão sobre esse tópico, não teria perguntado. A pesquisa no Google para "auto versus var C ++" ou "auto C ++" não retornou nada sobre esse tópico.
Giorgio
1
autofoi proposto para C ++ antes de varser introduzido em C #, portanto, a pergunta deve ser por que o C # não usa auto. var tem um significado diferente em JavaScript e Scala
adrianm

Respostas:

37

Quase todas as palavras que você pode pensar em adicionar como palavra-chave a um idioma quase certamente foram usadas como nome de variável ou alguma outra parte do código em funcionamento. Esse código seria quebrado se você tornasse essa palavra uma palavra-chave.

A coisa incrivelmente sortuda autoé que ela já era uma palavra-chave, então as pessoas não tinham variáveis ​​com esse nome, mas ninguém a usava, porque era o padrão. Por que digitar:

auto int i=0;

quando

int i=0;

significava exatamente a mesma coisa?

Suponho que em algum lugar do planeta havia uma pequena quantidade de código que usava 'auto' da maneira antiga. Mas poderia ser corrigido removendo o 'auto' e voltaria a funcionar. Portanto, foi uma escolha bastante óbvia reformular a palavra-chave.

Eu também acho que é um significado mais claro. Se você trabalhou com variantes e coisas desse tipo, quando vê, varpode pensar que a declaração é de alguma forma menos fortemente digitada do que se você tivesse pressionado todas as teclas no teclado para especificar o tipo da variável. Para mim, autofica mais claro que você está pedindo ao compilador para deduzir automaticamente o tipo, que é tão forte quanto se você o tivesse especificado. Então, foi realmente uma pausa de muita sorte que tornou um bom nome disponível para o comitê.

Para esclarecer a (pequena) quebra:

Se você tinha

auto int i=0;

e tentou compilar com um compilador C ++ 11, agora você receberá um erro como

erro C3530: 'auto' não pode ser combinado com nenhum outro especificador de tipo

Isso é trivial, basta remover o auto ou o int e recompilar.

Há um problema maior, no entanto. Se você tinha

auto i = 4.3;

C e o C ++ realmente antigo criariam ium int(como faria se você parasse auto- a declaração padrão era int). Se você passou muito tempo sem compilar esse código ou usou compiladores antigos, poderia ter parte desse código, pelo menos em teoria. O C ++ 11 tornaria isso uma doublevez que é isso que 4.3 é. (Ou talvez a float, eu ainda esteja no modo Boxing Day, mas a questão é que não int.) Isso pode apresentar erros sutis em todo o aplicativo. E sem nenhum aviso ou erro do compilador. As pessoas neste barco devem procurar globablly para autose certificar de que não o estavam usando da maneira antiga antes de passarem para um compilador C ++ 11. Felizmente, esse código é extremamente raro.

Kate Gregory
fonte
Obrigado por uma resposta muito clara. +1 Entendo o compromisso entre reduzir a compatibilidade com versões anteriores de uma maneira praticamente inofensiva e ter uma grande chance de que o código antigo não seja quebrado pela nova palavra-chave.
Giorgio
Existe realmente alguma incompatibilidade? Um compilador C ++ 11 não ignorará apenas autose for seguido por um nome de tipo?
Aaaaaaaaaaaa
1
Visual C ++ 2012, diz error C3530: 'auto' cannot be combined with any other type-specifiera essa linha
Kate Gregory
3
@ KateGregory: Na verdade, não há problema com isso auto i = 4.3;, porque isso foi mal formado no C ++ 03 / C ++ 98. O C ++ não carregou a regra 'int implícita' que o C89 possuía (e caiu na revisão do C99).
Bart van Ingen Schenau
1
@ Kate Gregory: Se você pudesse levar em consideração as observações de Bart e alterar sua resposta de acordo, eu a marcaria como a resposta aceita.
Giorgio