13

问题标题说明了一切:表单的声明是否int a = 0, b = a具有未定义的行为?

4

2 回答 2

12

不,这是明确定义的。这是一个带有两个声明符的声明,a并且b. 每个声明器都有一个初始化器。

声明中的每个init-declarator都被单独分析,就好像它本身在声明中一样。

也就是说,该行被视为:

int a = 0;
int b = a;
于 2013-03-12T20:37:30.270 回答
8

不,没有未定义的行为

根据 C++11 标准的第 8/3 段:

声明中的每个 init-declarator 都被单独分析,就好像它本身在声明中一样

此外,如脚注 97 所述:

具有多个声明符的声明通常等效于相应的声明序列,每个声明都具有单个声明符。那是

T D1, D2, ... Dn;

通常(*)相当于

T D1; T D2; ... T Dn;

这意味着a首先被初始化,然后b被初始化并采用 的值a。另请注意,即使情况并非如此,关于 SO是否会是 UB也存在相当长的争论,并且已经就这不是 UB 达成了一些共识。


(*):正如 Olaf Dietsche 在评论中所解释的,稍后在同一个脚注中提到了这种等价不成立的情况。

于 2013-03-12T20:42:01.883 回答