Ответ 1
Код не undefined pre-С++ 11, но порядок оценки не указан. Если мы рассмотрим проект стандартного раздела 1.9
В пункте 12 выполнения программы говорится:
Полное выражение - это выражение, которое не является подвыражением другого выражения. [...]
и в пункте 15 говорится:
Существует точка последовательности при завершении оценки каждого полного выражения 12).
тогда возникает вопрос, является ли count++, count++
полным выражением, а каждый count++
является подвыражением или каждый count++
обладает полным выражением и, следовательно, после каждой точки есть точка последовательности? если мы посмотрим на грамматику для этой инициализации из раздела 8.5
Инициализаторы:
initializer-clause:
assignment-expression
{ initializer-list ,opt }
{ }
initializer-list:
initializer-clause
initializer-list , initializer-clause
единственное выражение, которое мы имеем, это выражение-присваивание, а ,
, разделяющее компоненты, является частью списка инициализаторов, а не частью выражения, и поэтому каждый count++
является полным выражением и существует последовательность после каждого из них.
Эта интерпретация подтверждается следующим сообщением gcc
, который имеет очень похожий код для моего (я придумал свой примерный способ прежде чем я нашел этот отчет об ошибке):
int count = 23;
int foo[] = { count++, count++, count++ };
который заканчивается как отчет о дефекте 430, который я укажу:
[...] Я считаю, что стандарт ясен, что каждое выражение инициализатора в приведенном выше выражении является полным выражением (1.9 [intro.execution]/12-13, см. также выпуск 392) и, следовательно, существует точка последовательности после каждого выражения (1.9 [intro.execution]/16). Я согласен с тем, что стандарт, похоже, не диктует порядок, в котором выражения оцениваются, и, возможно, это должно быть. Кто-нибудь знает о компиляторе, который не оценил бы выражения слева направо?