问题标题说明了一切:int a = 0, b = a
形式的声明是否有未定义的行为?
答案 0 :(得分:12)
不,这是明确定义的。这是一个包含两个声明符a
和b
的声明。每个声明者都有一个初始化器。
声明中的每个 init-declarator 都会被单独分析,就好像它本身就在声明中一样。
也就是说,该行被视为:
int a = 0;
int b = a;
答案 1 :(得分:8)
不,没有未定义的行为。
C ++ 11标准的第8/3段:
声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样
此外,如脚注97所述:
具有多个声明符的声明通常等效于相应的声明序列,每个声明都有一个 声明符。那是
T D1, D2, ... Dn;
通常(*)相当于
T D1; T D2; ... T Dn;
这意味着首先初始化a
,然后初始化b
并假设a
的值。另请注意,即使不是这种情况,也有quite a long debate on SO关于这是否会成为UB,并且已达成一些共识,而不是UB。
(*):正如Olaf Dietsche在评论中所解释的那样,等效性不的情况将在后面的同一脚注中提及。