Заголовок вопроса говорит все: декларации формы int a = 0, b = a
имеют неопределенное поведение?
Имеет ли "int a = 0, b = a" неопределенное поведение?
Ответ 1
Нет, это четко определено. Это декларация с двумя деклараторами: a
и b
. Каждый декларатор имеет инициализатор.
Каждый декларатор init в декларации анализируется отдельно, как если бы он был в декларации сам по себе.
То есть, линия обрабатывается как:
int a = 0;
int b = a;
Ответ 2
Нет, нет неопределенного поведения.
В пункте 8/3 стандарта С++ 11:
Каждый декларатор init в декларации анализируется отдельно, как если бы он был в декларации сам по себе
Кроме того, в сноске 97 указано:
Объявление с несколькими деклараторами обычно эквивалентно соответствующей последовательности объявлений, каждая из которых содержит один декларатор. То есть
T D1, D2,... Dn;
обычно (*) эквивалентно
T D1; T D2;... T Dn;
Это означает, что a
сначала инициализируется, затем b
инициализируется и принимает значение a
. Также обратите внимание, что даже если бы этого не было, было много длительных споров по поводу того, будет ли это или не будет UB, и был достигнут определенный консенсус в отношении того, что это не является UB.
(*): Как объяснил Олаф Дицке в комментариях, ситуации, в которых эта эквивалентность не выполняется, упоминаются позже в той же сноске.