Recentemente, eu estava me perguntando por que a palavra-chave auto
foi escolhida no C ++ 11 para marcar uma variável cujo tipo deve ser inferido pelo compilador, como em
auto x = 1;
Desde a
var
parece mais comum em outras linguagens de programação (por exemplo, C #, Scala, JavaScript) e- Pelo que entendi, a nova semântica das
auto
quebras 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 var
ou 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?
c++
c++11
type-systems
Giorgio
fonte
fonte
auto
pode quebrar a compatibilidade com versões anteriores, mas, dependendo da frequência com quevar
é usado como nome de variável em comparação com a frequência com que aauto
palavra-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.auto
vsvar
é 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)auto
foi proposto para C ++ antes devar
ser introduzido em C #, portanto, a pergunta deve ser por que o C # não usa auto. var tem um significado diferente em JavaScript e ScalaRespostas:
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:quando
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ê,
var
pode 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,auto
fica 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
e tentou compilar com um compilador C ++ 11, agora você receberá um erro como
Isso é trivial, basta remover o auto ou o int e recompilar.
Há um problema maior, no entanto. Se você tinha
C e o C ++ realmente antigo criariam
i
umint
(como faria se você parasseauto
- a declaração padrão eraint
). 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 umadouble
vez que é isso que 4.3 é. (Ou talvez afloat
, eu ainda esteja no modo Boxing Day, mas a questão é que nãoint
.) Isso pode apresentar erros sutis em todo o aplicativo. E sem nenhum aviso ou erro do compilador. As pessoas neste barco devem procurar globablly paraauto
se 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.fonte
auto
se for seguido por um nome de tipo?error C3530: 'auto' cannot be combined with any other type-specifier
a essa linhaauto 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).