gpt4 book ai didi

c++ - 为什么这个简单的赋值是未定义的行为?

转载 作者:IT老高 更新时间:2023-10-28 23:17:34 30 4
gpt4 key购买 nike

我正在刷新我对值初始化与默认初始化的理解,并遇到了 this :

struct C {
int x;
int y;
C () { }
};

int main () {
C c = C ();
}

显然这是 UB 因为

In the case of C(), there is a constructor that is capable of initializing the x and y members, so no initialization takes place. Attempting to copy C() to c therefore results in undefined behavior.

我想我明白为什么,但我不确定。有人可以详细说明吗?

也就是说这也是UB?

int x; x = x;

顺便说一句,关于值初始化,以下是否保证为零?

int x = int ();

最佳答案

您的第一个示例具有未定义的行为,因为默认的编译器生成的复制构造函数将进行成员复制,ints 可能有陷印值,并读取陷印值来复制它可能会导致程序崩溃。

在实践中,我无法想象这真的会崩溃;编译器几乎肯定会优化拷贝,即使没有,它可能会使用一些特殊的按位复制,无需复制检查陷印值。 (在 C++ 中,您可以保证能够复制字节。)

对于第二种情况,同样是未定义的行为。虽然在这种情况下,你有赋值而不是复制构造,编译器是不太可能优化它。 (你的第一个任务没有例如,仅复制构造。)

第三个,是的。带有空括号的初始化程序(并且没有用户定义的默认初始化程序来覆盖它)首先执行零初始化(与具有静态生命周期的变量完全相同)。

关于c++ - 为什么这个简单的赋值是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9163555/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com