C ++ 17 (N4659
) включает предложение Refining Expression Evaluation Order для Idiomatic C ++ , которое определяет более строгий порядок оценки выражения.
В частности, [ было добавлено следующее предложение :
8.18 Операторы присваивания и составного присваивания: ....
Во всех случаях назначение упорядочивается после значения вычисление правого и левого операндов и перед вычислением значения выражения присваивания. Правильный операнд секвентирован перед левым операндом.
blockquote>Он делает несколько случаев ранее не определенного поведения действительными, включая тот, о котором идет речь:
a[++i] = i;
Однако несколько других подобных случаев по-прежнему приводят к неопределенному поведению.
В
N4140
:i = i++ + 1; // the behavior is undefined
Но в
N4659
i = i++ + 1; // the value of i is incremented i = i++ + i; // the behavior is undefined
Конечно, использование компилятора, совместимого с C ++ 17, не обязательно означает, что следует начинать писать такие выражения.