На мой взгляд, новые правила сложнее описать и понять.Например, учтите, что:
int x = 12;
x = x++ + 1; // undefined behaviour
x = ++x + 1; // valid
Я бы предложил просто избегать нескольких побочных эффектов для одной и той же переменной в одном и том же выражении, которое проще для понимания.AFAIK C ++ 0X изменил некоторые случаи, которые в прошлом были неопределенным поведением и которые теперь являются законными (например, второе из двух приведенных выше выражений), но помните, что есть и всегда будет разница между тем, что является законным и тем, чтоморально ;-) ... никто не заставляет вас использовать такие вещи.
На самом деле в вышеприведенном случае кажется, что валидность второго выражения произошла непреднамеренно как побочный эффект решения другой проблемы (# 222) на языке.Было принято решение сделать выражение действительным, потому что считалось, что изменение чего-то с UB на четко определенное не принесет никакого вреда.Тем не менее, я думаю, что, хотя это и не повредило программам (где, конечно, UB является наихудшей из возможных проблем), на самом деле это нанесло некоторый ущерб самому языку ... изменив правило, которое уже было сложно объяснить и понятьеще более непонятный.
IMO C ++ продолжает свою естественную эволюцию из C в язык, где множество симпатичных и логичных высказываний может делать замечательные вещи ... и в которых другая куча одинаково хорошихвыглядящие одинаково красивые и одинаково логичные утверждения могут заставить ваш компьютер взорваться.