Motivación y dificultades (?) De la palabra clave auto en C ++ 11

20

Recientemente me preguntaba por qué autose 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

  1. var parece más común en otros lenguajes de programación (por ejemplo, C #, Scala, JavaScript) y
  2. Por lo que yo entiendo, la nueva semántica de las autopausas 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 varo 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?

Giorgio
fuente
99
La nueva semántica de autopodría romper la compatibilidad con versiones anteriores, pero, dependiendo de la frecuencia con la que varse usa como nombre de variable en comparación con la frecuencia con la que autose 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.
sepp2k
2
"Tal como está actualmente, esta pregunta no se ajusta bien a nuestro formato de preguntas y respuestas. Esperamos que las respuestas estén respaldadas por hechos, referencias o experiencia específica, pero es probable que esta pregunta solicite debate, argumentos, encuestas o discusión extendida. Si cree que esta pregunta puede mejorarse y posiblemente volverse a abrir, consulte las preguntas frecuentes para obtener orientación ". Esta pregunta es sobre un hecho: hubo una discusión sobre este tema. Hay dos respuestas posibles: SÍ y NO.
Giorgio
2
Por supuesto, hubo una discusión, lo que hace que la pregunta no tenga sentido en ese sentido. La pregunta autovs vares 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)
Telastyn
1
@Telastyn: Si hubiera sabido que había habido una discusión sobre este tema, no habría preguntado. Buscar en Google "auto versus var C ++" o "auto C ++" no arrojó nada sobre este tema.
Giorgio
1
autose propuso para C ++ antes de que varse 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 Scala
adrianm

Respuestas:

37

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 autoes 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:

auto int i=0;

cuando

int i=0;

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í, autoaclara 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

auto int i=0;

e intentó compilar con un compilador de C ++ 11, ahora obtendrá un error como

error C3530: 'auto' no se puede combinar con ningún otro especificador de tipo

Esto es trivial, solo elimina el auto o el int y vuelve a compilar.

Sin embargo, hay un problema mayor. Si tuvieras

auto i = 4.3;

C y el C ++ realmente antiguo harían iun int(como lo haría si lo dejara auto, la declaración predeterminada era int). 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 un doubleya que eso es 4.3. (O tal vez float, todavía estoy en modo Boxing Day, pero el punto es, no un int.) 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 para autoasegurarse 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.

Kate Gregory
fuente
Gracias por una respuesta muy clara. +1 Entiendo la compensación entre dejar caer la compatibilidad con versiones anteriores de una manera mayormente inofensiva y tener una gran posibilidad de que la nueva palabra clave no rompa el código antiguo.
Giorgio
¿Existe realmente alguna incompatibilidad? ¿Un compilador de C ++ 11 no ignorará el autosi es seguido por un nombre de tipo?
aaaaaaaaaaaa
1
Visual C ++ 2012 dice error C3530: 'auto' cannot be combined with any other type-specifiera esa línea
Kate Gregory
3
@KateGregory: En realidad, no hay ningún problema auto 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).
Bart van Ingen Schenau
1
@Kate Gregory: Si pudiera tener en cuenta las observaciones de Bart y cambiar su respuesta en consecuencia, lo marcaría como la respuesta aceptada.
Giorgio