2013-04-25 3 views
18

Does int a=1, b=a++; invoke undefined поведение? Между инициализацией a и его доступом и модификацией в инициализаторе нет точки последовательности, которая указывает на b, но, насколько я могу судить, инициализация не является «модификацией» объекта; инициализатор указан, чтобы дать «начальное значение» объекта. Per 6.7.8 Инициализация, пункт 8:Имеет ли int a = 1, b = a ++; вызывать неопределенное поведение?

Инициализатор определяет начальное значение, хранящееся в объекте.

и кажется разумным воспринимать «начальную» как последовательность перед любым доступом к объекту. Рассматривается ли этот вопрос раньше, и есть ли принятая интерпретация?

+0

Я бы сказал, что сноска 97 говорит, что это идентично 'int a = 1; int b = a ++; '. –

+0

@KerrekSB: Сноска 97 в какой версии (или черновике) стандарта? Номера сносок гораздо менее стабильны, чем номера разделов. –

+0

IIRC, в новейших версиях стандарта, концепция «точек последовательности» устаревает. Что касается сносок, то в последнее время обсуждалась сноска, которая определяла порядок обработки конструкции declare-and-initialize, и эта сноска на самом деле кажется довольно старой и стабильной :) – quetzalcoatl

ответ

24

Он не вызывает неопределенное поведение. В пункте 6.7.6 (3) указывается

Полный декларатор - это декларатор, который не является частью другого декларатора. Конец полного объявления является точкой последовательности.

что конец полного декларатора является точкой последовательности.

int a = 1, b = a++; 
    //^end of full declarator 
+0

'6.7.6 (3)' <- что это? – Sayakiss

+1

Раздел 6.7.6, пункт 3 стандарта (ну, проект N1570, так как у меня нет денег, чтобы купить дорогой стандарт, который мне не нужен). В этом разделе рассматриваются деклараторы. –

Смежные вопросы