Recientemente me preguntaba por qué auto
se eligió la palabra clave en C ++ 11 para marcar una variable cuyo tipo debe ser inferido por el compilador, como en
auto x = 1;
Ya que
var
parece más común en otros lenguajes de programación (por ejemplo, C #, Scala, JavaScript) y- Por lo que yo entiendo, la nueva semántica de las
auto
pausas de compatibilidad con versiones anteriores (rara vez se usaba, pero tenía un significado diferente en revisiones anteriores de C ++, ver, por ejemplo, aquí )
Quería preguntar si había una razón especial para elegir auto
(a favor var
o en cualquier otra palabra clave). ¿Hubo alguna discusión específica sobre este tema antes de que se lanzara el estándar C ++ 11?
Además, ¿hay posibles incompatibilidades que debemos tener en cuenta al volver a compilar código C ++ heredado con un compilador C ++ 11?
c++
c++11
type-systems
Giorgio
fuente
fuente
auto
podría romper la compatibilidad con versiones anteriores, pero, dependiendo de la frecuencia con la quevar
se usa como nombre de variable en comparación con la frecuencia con la queauto
se usa la palabra clave en el código anterior al 11, el comité podría haber opinado que rompe la compatibilidad de manera menos dramática que la introducción de un nuevo palabra clave lo haría.auto
vsvar
es a qué se refiere el 90% de su texto, y esa pregunta no tiene un resultado definitivo. (aunque no fui yo quien votó para cerrar)auto
se propuso para C ++ antes de quevar
se introdujera en C #, por lo que la pregunta debería ser por qué C # no usa auto. var tiene un significado diferente en JavaScript y ScalaRespuestas:
Casi todas las palabras que podría pensar en agregar como palabra clave a un idioma se han usado casi con certeza como un nombre de variable o alguna otra parte del código de trabajo. Este código se rompería si convirtiera esa palabra en una palabra clave.
Lo increíblemente afortunado
auto
es que ya era una palabra clave, por lo que las personas no tenían variables con ese nombre, pero nadie lo usaba, porque era el valor predeterminado. Por qué escribir:cuando
significaba exactamente lo mismo?
Supongo que en algún lugar del planeta había una pequeña cantidad de código que usaba 'auto' a la antigua usanza. Pero podría solucionarse quitando el 'auto' y estaría funcionando nuevamente. Por lo tanto, fue una elección bastante obvia reutilizar la palabra clave.
También creo que es un significado más claro. Si ha trabajado con variantes y tal, cuando vea
var
, puede pensar que la declaración está de alguna manera menos tipeada que si presiona todas las teclas en el teclado para especificar el tipo de la variable. Para mí,auto
aclara que le está pidiendo al compilador que deduzca automáticamente el tipo, que es tan fuerte como si lo hubiera especificado usted mismo. Así que realmente fue un golpe de suerte que hizo que un buen nombre estuviera disponible para el comité.Para aclarar la ruptura (pequeña):
Si tuvieras
e intentó compilar con un compilador de C ++ 11, ahora obtendrá un error como
Esto es trivial, solo elimina el auto o el int y vuelve a compilar.
Sin embargo, hay un problema mayor. Si tuvieras
C y el C ++ realmente antiguo harían
i
unint
(como lo haría si lo dejaraauto
, la declaración predeterminada eraint
). Si ha pasado mucho tiempo sin compilar este código, o ha estado utilizando compiladores antiguos, podría tener parte de este código, al menos en teoría. C ++ 11 lo convertiría en undouble
ya que eso es 4.3. (O tal vezfloat
, todavía estoy en modo Boxing Day, pero el punto es, no unint
.) Esto podría introducir errores sutiles en toda la aplicación. Y sin advertencias o errores del compilador. Las personas en este bote deben buscar globalmente paraauto
asegurarse de que no lo estén usando de la manera anterior antes de pasar a un compilador de C ++ 11. Afortunadamente, dicho código es extremadamente raro.fuente
auto
si es seguido por un nombre de tipo?error C3530: 'auto' cannot be combined with any other type-specifier
a esa líneaauto i = 4.3;
, porque eso estaba mal formado en C ++ 03 / C ++ 98. C ++ no no llevar más de la regla 'int implícito' que tenía C89 (y se dejó caer en la revisión C99).