En mi opinión, las nuevas reglas son más complejas de describir y comprender. Por ejemplo, considero que:
int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid
Yo sugeriría que simplemente evitar múltiples efectos secundarios a la misma variable en la misma expresión que es una regla simple de entender. AFAIK C++ 0X cambió algunos casos que en el pasado eran un comportamiento indefinido y que ahora son usos legales (por ejemplo, la segunda de las dos expresiones anteriores), pero recuerde que siempre habrá una diferencia entre lo que es legal y lo que es moral ;-) ... nadie te está forzando a usar tales cosas.
En realidad, en el caso anterior parece que la validez de la segunda expresión ocurrió involuntariamente como un efecto secundario de la fijación de otro problema (# 222) en el idioma. La decisión fue hacer válida la expresión porque se consideró que cambiar algo de UB a bien definido no iba a causar 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 dañó el lenguaje en sí ... cambiando una regla que ya era compleja de explicar y comprender. uno aún más oscuro.
IMO C++ continúa con su evolución natural de C a un lenguaje en el que un montón de buenas y lógicas afirmaciones pueden hacer cosas maravillosas ... y en las que otro grupo igualmente guapo, igual de agradable e igualmente lógico las declaraciones pueden hacer explotar su computadora en su lugar.
Bueno, antes que nada ... el comportamiento indefinido en C++ 0x no causa demonios nasales ... convoca a los monos a tope. –
No creo que valga la pena aprender. Esas expresiones aún no son legibles por humanos. – UncleBens
@UncleBens: ¿qué parte de "por ejemplo" no estaba en una fuente lo suficientemente grande para usted? ;-) –