Je me demandais récemment pourquoi le mot clé a auto
été choisi en C ++ 11 pour marquer une variable dont le type doit être déduit par le compilateur, comme dans
auto x = 1;
Puisque
var
semble plus courant dans d'autres langages de programmation (par exemple C #, Scala, JavaScript), et- Pour autant que je comprends la nouvelle sémantique de la
auto
rétrocompatibilité des ruptures (elle était rarement utilisée mais avait une signification différente dans les versions précédentes de C ++, voir par exemple ici )
Je voulais demander s'il y avait une raison particulière de choisir auto
(en faveur de var
ou tout autre mot clé). Y a-t-il eu une discussion spécifique sur ce problème avant la publication de la norme C ++ 11?
Existe-t-il également des incompatibilités possibles lors de la recompilation du code C ++ hérité avec un compilateur C ++ 11?
c++
c++11
type-systems
Giorgio
la source
la source
auto
pourrait rompre la compatibilité descendante, mais, selon la fréquence d'var
utilisation en tant que nom de variable par rapport à la fréquence d'utilisation duauto
mot-clé dans le code antérieur à 11, le comité aurait pu penser qu'il rompt la compatibilité moins dramatiquement que l'introduction d'un nouveau mot-clé serait.auto
vsvar
est la référence à 90% de votre texte, et cette question n'a pas de résultat définitif. (même si je ne suis pas celui qui a voté pour fermer)auto
a été proposé pour C ++ avant d'var
être introduit en C # donc la question devrait être de savoir pourquoi C # n'utilise pas auto. var a une signification différente dans JavaScript et ScalaRéponses:
Presque chaque mot que vous pourriez penser ajouter comme mot-clé à une langue a presque certainement été utilisé comme nom de variable ou autre partie du code de travail. Ce code serait rompu si vous faisiez de ce mot un mot-clé.
La chose incroyablement chanceuse
auto
est qu'il s'agissait déjà d'un mot-clé, donc les gens n'avaient pas de variables avec ce nom, mais personne ne l'a utilisé, car c'était la valeur par défaut. Pourquoi taper:quand
signifiait exactement la même chose?
Je suppose que quelque part sur la planète, il y avait une petite quantité de code qui utilisait «auto» à l'ancienne. Mais cela pourrait être corrigé en supprimant l '«auto» et cela fonctionnerait à nouveau. C'était donc un choix assez évident de réutiliser le mot-clé.
Je pense aussi que c'est un sens plus clair. Si vous avez travaillé avec des variantes et autres, quand vous voyez,
var
vous pouvez penser que la déclaration est en quelque sorte moins fortement tapée que si vous avez appuyé vous-même sur toutes les touches du clavier pour spécifier le type de la variable. Pour moi,auto
il est plus clair que vous demandez au compilateur de déduire automatiquement le type, qui est tout aussi fort que si vous l'aviez spécifié vous-même. Ce fut donc vraiment une pause très chanceuse qui a mis un bon nom à la disposition du comité.Pour clarifier la (petite) rupture:
Si tu avais
et essayé de compiler avec un compilateur C ++ 11, vous obtiendrez maintenant une erreur telle que
C'est trivial, vous supprimez simplement l'auto ou l'int et recompilez.
Il y a cependant un problème plus important. Si tu avais
C et le très ancien C ++ feraient
i
unint
(comme ce serait le cas si vous vous étiez arrêtéauto
- la déclaration par défaut étaitint
). Si vous êtes resté très longtemps sans compiler ce code, ou si vous avez utilisé d'anciens compilateurs, vous pourriez avoir une partie de ce code, au moins en théorie. C ++ 11 en ferait undouble
puisque c'est ce que 4.3 est. (Ou peut-être unfloat
, je suis toujours en mode Boxing Day, mais ce n'est pas un anint
.) Cela pourrait introduire de subtils bugs dans votre application. Et sans avertissements ni erreurs du compilateur. Les personnes dans ce bateau doivent rechercher globalement pourauto
s'assurer qu'elles ne l'utilisent pas à l'ancienne avant de passer à un compilateur C ++ 11. Heureusement, un tel code est extrêmement rare.la source
auto
s'il est suivi d'un nom de type?error C3530: 'auto' cannot be combined with any other type-specifier
à cette ligneauto i = 4.3;
, car c'était mal formé en C ++ 03 / C ++ 98. C ++ n'a pas repris la règle «implicit int» que C89 avait (et a été supprimée dans la révision C99).