spr*_*aff 12 c++ undefined-behavior value-initialization
我清楚了解了我对价值初始化与默认初始化的理解,并且发现了这个:
struct C {
int x;
int y;
C () { }
};
int main () {
C c = C ();
}
Run Code Online (Sandbox Code Playgroud)
显然这是UB,因为
在C()的情况下,有一个能够初始化x和y成员的构造函数,因此不会进行初始化.因此,尝试将C()复制到c会导致未定义的行为.
我想我理解为什么,但我不确定.有人可以详细说明吗?
这是否意味着这也是UB?
int x; x = x;
Run Code Online (Sandbox Code Playgroud)
顺便提一下,关于值初始化,以下是否保证为零?
int x = int ();
Run Code Online (Sandbox Code Playgroud)
Jam*_*nze 13
您的第一个示例具有未定义的行为,因为默认的,编译器生成的复制构造函数将执行成员复制,ints可能具有陷阱值,并且读取陷印值以复制它可能导致程序崩溃.
在实践中,我无法想象这实际上会崩溃; 编译器几乎肯定会优化副本,即使它没有,它可能会使用一些特殊的按位复制,它会复制而不检查捕获值.(在C++中,您可以保证能够复制字节.)
对于第二种情况,再次,未定义的行为.虽然在这种情况下,您具有赋值而不是复制构造,但编译器不太可能将其优化.(您的第一个示例中没有赋值,只有复制构造.)
对于第三个,是的.具有空括号的初始化程序(并且没有用户定义的默认初始化程序来覆盖它)首先执行零初始化(与具有静态生存期的变量完全相同).