Является ли поведение я + = ++ я undefined в С++ 0x?

Я очень убежден в том, что объяснение, которое я нашел, сказал, что i = ++i не undefined до C + + 0x, но я не могу судить, хорошо ли определено поведение i += ++i или нет. Любые участники?

Ответы

Ответ 1

Обоснование, которое делает i = ++i корректным, равномерно использоваться для доказательства того, что i += ++i также должно быть четко определено.

i += ++i эквивалентен i += (i += 1), а для новых правил секвенирования требуется, чтобы присвоение выполнялось перед вычислением значения субэкпозиции i += 1.
Это означает, что результат выражения i += ++i должен быть таким же, как и для i = 2 * i + 1.

Изменить: Я должен пересмотреть свой ответ, потому что поведение undefined в конце концов.
Поведение i += ++i составляет undefined, потому что вычисления значений подвыражений i (аргумент левой стороны) и ++i не связаны друг с другом по порядку, а одно из них содержит обновление объект i.

Это не проблема для выражения i = ++i, так как там i в левой части не проходит преобразование lvalue-to-r, что происходит в случае i += ++i.


На стороне заметки: не пишите такой код в каком-либо серьезном проекте. Он слишком полагается на то, чтобы точно знать правила секвенирования, и будет много людей, которые либо неправильно понимают правила секвенирования, либо не знают об изменениях в правилах, которые являются результатом DR 637, или могут быть сбиты с ног, аспекты рассматриваемого выражения (как это случилось со мной при составлении первой ревизии этого ответа).