`int a = 0,b = a`是否有未定义的行为?

Pau*_*nta 13 c++ declaration undefined-behavior

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

Jos*_*eld 12

不,这是明确定义的.这是一个包含两个声明符的声明,ab.每个声明者都有一个初始化器.

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

也就是说,该行被视为:

int a = 0;
int b = a;
Run Code Online (Sandbox Code Playgroud)

  • "单独分析"似乎没有表明执行声明中的排序.标准中有更强的迹象吗? (4认同)

And*_*owl 8

不,没有未定义的行为.

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

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

另外,如脚注97所述:

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

T D1, D2, ... Dn;

通常(*)相当于

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

这意味着a首先初始化,然后b初始化并假定值a.同时请注意,即使情况并非如此,关于这是否会成为UB的问题仍然存在很长时间的争论,并且已经达成了一些关于这不是UB的共识.


(*):由于在评论中所解释的奥拉夫Dietsche,在此不等价的情况下,抱以同样的脚注中提到以后.