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