От §5.2.6 / 1 у нас (акцент мой):
Значение выражения postfix ++ — это значение его операнда. [
Примечание: полученное значение является копией исходного значения — примечание конца] Операндом должно быть изменяемое значение l. Тип операнда
должен быть арифметическим типом, отличным от cv bool, или указателем на
полный тип объекта. Значение объекта операнда изменяется
добавив 1 к нему. Вычисление значения выражения ++
последовательность перед модификацией объекта операнда. С
уважение к неопределенно-последовательному вызову функции, операция
Postfix ++ является единственной оценкой. [Примечание: следовательно, функция
вызов не должен вмешиваться между преобразованием lvalue в rvalue и
побочный эффект, связанный с любым отдельным оператором postfix ++. — конец
примечание] Результат является prvalue. Тип результата:
cv-неквалифицированная версия типа операнда. Если операнд
битовое поле, которое не может представлять увеличенное значение, результирующее
Значение битового поля определяется реализацией. Смотрите также [expr.add] и [expr.ass].
То есть модификация объекта операнда после вычисление значения ++
выражение.
От §5.18 / 1 у нас (акцент мой):
Оператор присваивания (=) и все составные операторы присваивания
группа справа налево. Все требуют изменяемого lvalue как их левый
операнд и возвращает значение l, ссылаясь на левый операнд. Результат
во всех случаях это битовое поле, если левый операнд является битовым полем. В целом
случаи, присваивание выполняется после вычисления значения
правый и левый операнды, и до вычисления значения
выражение присваивания. По отношению к неопределенно последовательным
вызов функции, операция составного присваивания является одной
оценка. [Примечание: следовательно, вызов функции не должен вмешиваться
между преобразованием lvalue в rvalue и побочным эффектом, связанным
с любым составным оператором присваивания. — конец примечания]Назначение выражение:
условно-выражение
логико-или-выражение Назначение-оператор инициализатор-раздел
вбрасывание выражениеНазначение-оператор: один из
= * = / =% = + = — = >> = <<знак равно &= ^ = | =
Назначение также после вычисление значения правого и левого операндов оператора присваивания.
Таким образом, если мы рассмотрим выражение
i = i++;
мы знаем из §5.2.6 / 1, что побочный эффект выражения i++
на RHS этого выражения присваивания последовательности после вычисления значения i++
, А из §5.18 / 1 мы знаем, что побочный эффект, соответствующий присвоению i
На LHS оператор присваивания секвенируется после вычисления значения правого и левого операндов оператора присваивания.
Но как мне показать, что эти два побочных эффекта не последовательны, чтобы доказать, что выражение i = i++;
показывает неопределенное поведение?
Во-первых, если A не секвенируется до B, а B не секвенируется до A, тогда A и B unsequenced (1,9 / 13). Это определение непоследовательных. Во-вторых, если два побочных эффекта на скалярный объект не секвенированы, поведение не определено (1.9 / 15). Поэтому, если вы не можете найти что-то, что говорит о том, что постинкремент и присваивание являются последовательными (и вы не будете), поведение не определено.
Других решений пока нет …