Рассмотрим следующий код:
int main()
{
int count = 0 ;
int arrInt[2] = { count++, count++ } ;
return 0 ;
}
Если мы скомпилируем код с помощью clang -std=c++03
, он выдает следующее предупреждение (живой пример):
warning: multiple unsequenced modifications to 'count' [-Wunsequenced]
int arrInt[2] = { count++, count++ } ;
^ ~~
Я не выступаю за такой код, но аналогичный код возник в другом вопросе, и возникли разногласия по поводу того, определено оно или нет в соответствии со стандартным pre-С++ 11. В С++ 11 это поведение является четко определенным поведением в соответствии с Являются ли множественные мутации в списках инициализатора undefined, и действительно, если я использую -std=c++11
, тогда предупреждение уходит.
Если мы посмотрим на pre-С++ 11 черновик проекта, у него нет того же языка, который содержит список инициализаторов, поэтому кажется мы остаемся с Chapter 5
выражением абзаца 4, в котором говорится:
За исключением тех случаев, когда отмечено, порядок оценки операндов отдельных операторов и подвыражений отдельных выражений и порядок, в котором происходят побочные эффекты, не определены. 57) Между предыдущей и следующей последовательностью точка скалярного объекта должна иметь значение хранимого значения, измененное не более одного раза путем оценки выражения. Кроме того, к предыдущему значению следует обращаться только для определения значения, которое необходимо сохранить. Требования настоящего параграфа удовлетворяются для каждого допустимого упорядочения подвыражений полного выражения; в противном случае поведение undefined.
Для того, чтобы это было undefined, казалось бы, нам нужно было бы интерпретировать count++, count++
как выражение и, следовательно, каждый count++
как подвыражение, так же как и этот код undefined pre-С++ 11?