sintaxis - ¿Cuál es la diferencia en el comportamiento indefinido entre C++ 03 y C++ 11?
sintaxis de c++ (2)
C ++ 0x cambia una cantidad de casos previamente no definidos a casos ahora compatibles condicionalmente . La semántica es:
- Si la implementación no es compatible con la función con soporte condicional, deberá documentar eso y emitirá un diagnóstico para un programa que lo infrinja.
- Si la implementación lo admite, debe cumplir con los requisitos adicionales que el estándar establece. Por ejemplo, el Estándar podría decir que algo está soportado condicionalmente con semántica definida por la implementación. Si es así, la implementación debe documentar cómo soporta la característica.
Un caso popular que anteriormente no estaba definido es cuando se pasa un argumento de tipo de clase que tiene un constructor de copia no trivial, un contructor de movimiento no trivial o un destructor no trivial a través de un parámetro de función de puntos suspensivos. Esto ahora es soportado condicionalmente, con semántica de fi nida por implementación.
El nuevo estándar tiene un comportamiento indefinido diferente del anterior. Las nuevas reglas de secuenciación, por ejemplo, significan que algunas operaciones aritméticas que antes no estaban definidas (por razones tales como escrituras múltiples entre puntos de secuencia) ahora están definidas.
Entonces, ¿qué necesitamos aprender de nuevo sobre el comportamiento indefinido?
En mi opinión, las nuevas reglas son más complejas de describir y comprender. Por ejemplo considera que:
int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid
Yo sugeriría simplemente evitar múltiples efectos secundarios a la misma variable en la misma expresión que es una regla más fácil de entender. AFAIK C ++ 0X cambió algunos casos que eran comportamientos indefinidos en el pasado y que ahora son usos legales (por ejemplo, la segunda de las dos expresiones anteriores), pero recuerde que existe y siempre habrá una diferencia entre lo que es legal y lo que es. es moral ;-) ... nadie te obliga a usar esas cosas.
En realidad, en el caso anterior parece que la validez de la segunda expresión ocurrió involuntariamente como un efecto secundario de solucionar otro problema (# 222) en el idioma. La decisión fue hacer que la expresión fuera válida porque se consideró que cambiar algo de UB a bien definido no iba a hacer ningún daño. Sin embargo, creo que si bien esto no causó ningún daño a los programas (donde, por supuesto, UB es el peor problema posible), en realidad causó algunos daños al lenguaje en sí ... cambiando una regla que ya era compleja de explicar y comprender. Una aún más oscura.
IMO C ++ continúa con su evolución natural de C a un lenguaje en el que un montón de declaraciones bonitas y lógicas atractivas pueden hacer cosas maravillosas ... y en el que otro grupo de declaraciones igualmente bonitas, igualmente bonitas e igualmente lógicas pueden hacer que su ordenador para explotar en su lugar.