gpt4 book ai didi

c++ - 使用赋值是危险的,因为之前的值是无效的

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:11 25 4
gpt4 key购买 nike

对未初始化的数据使用赋值是否危险?

在使用赋值运算符时我应该在什么时候格外小心?

我之所以问是因为我在看视频C++ and Beyond 2012: Andrei Alexandrescu - Systematic Error Handling in C++他在那里展示了Expected<T>具有值或异常的类。移动构造函数定义为

Expected(Expected&& rhs) : .. {
if (gotHam) new(&ham) T(std::move(rhs.ham));
...

哪里ham定义为

union {
T ham;
std::exception_ptr spam;
};

他解释了使用 placement new 背后的原因,并在 28:49 说,由于他使用的是 union ,因此他必须格外小心地管理初始化。然后他在 29:14 进一步指出:

I couldn't use an assignment because assignment assumes that the previous value was valid

我不明白这一点 - 为什么赋值要求先前的值有效?我会把它比作这样的东西:

int i; // unassigned, i.e. not valid
i = 0; // so this would thus be dangerous?

我在想这可能与 union 有关, 未初始化,但我仍然看不到作业的危害。为什么赋值会关心之前的值?

最佳答案

他的意思是 T 的构造函数从未运行过。因此你不能以任何方式使用火腿对象。将它放在这样的 union 中是我所知道的在不运行其构造函数的情况下正式拥有可用命名对象的唯一方法。

这就是为什么我不认为 union 在 C++ 程序中有任何位置。

关于c++ - 使用赋值是危险的,因为之前的值是无效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837024/

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