对未初始化的数据使用赋值是否危险?
使用赋值运算符时什么时候应该格外小心?
我之所以问这个问题是因为我在看视频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;
};
他解释了使用新布局背后的共鸣,并在 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/