Имеет ли "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.


(*): Как объяснил Олаф Дицке в комментариях, ситуации, в которых эта эквивалентность не выполняется, упоминаются позже в той же сноске.