对未初始化的数据使用分配是否危险?
使用赋值运算符时,我应该多加注意?
我问的原因是因为我正在观看视频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他说,因为他使用工会,他必须特别小心管理初始化。然后他在29:14进一步指出:
我无法使用赋值,因为赋值假定为 之前的值有效
我不明白这一点 - 为什么作业要求先前的值有效?我会把它比作这样的东西:
int i; // unassigned, i.e. not valid
i = 0; // so this would thus be dangerous?
我在想,也许它与联盟有关,并且类未初始化,但我仍然没有看到分配中的伤害。为什么作业会关注以前的值?
答案 0 :(得分:2)
他的意思是T的构造函数从未运行过。因此你不能以任何方式使用火腿对象。将它放在像这样的联合中是我所知道的唯一方法,正式拥有一个可用的命名对象,而不使用它的构造函数。
这就是为什么我不相信工会在C ++程序中占有一席之地。