Просто просмотрел C99 и C11, пытаясь выяснить, гарантируют ли они, что несколько деклараторов в одном объявлении выполняются по порядку слева направо. Они говорят, что каждый полный декларатор заканчивается в точке последовательности
6.7.5 C99 Деклараторы
6.7.6 C11 Деклараторы
3 Полный декларатор является декларатором, который не является частью другого декларатора. Конец полного декларатора является точкой последовательности. [...]
но, похоже, нет ничего, что могло бы сказать, что индивидуальные инициализации выполняются в порядке слева направо. Неужели это неуточнено или мне не хватает чего-то простого?
int main() {
int i = 0;
int a = i++, b = i++;
// Are values of `a` and `b` specified here?
}
Если порядок не указан, он запрещает следующий шаблон реализации
int array[N];
for (int *element = array, *element_end = element + N;
element != element_end;
++element)
*element = 0;
который кажется мне удивительным. (Я понимаю, что вместо element_end
можно инициализировать array + N
.)
P.S. Спецификация С++ не является точно выраженной в этом отношении. В нем есть сноска, в которой говорится, что T d1, d2;
эквивалентно T d1; T d2;
, но они ненормативны. Следовательно, очевидно, что DR # 1342