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

标签 c++

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

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

我之所以问这个问题是因为我在看视频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/

相关文章:

c++ - 无法在 OpenGL 中渲染天空盒

c++ - 使用递归检查回文

c++ - 为什么更改 block 和网格大小会对运行时产生如此大的影响?

c++ - C++中的优先级队列

c# - 在 C# 中处理 char*(strlen 函数?)

c++ - 在 C++ 中用递归替换 N 级 for 循环

c++ - 类基本运算符

C++ vector push_back 方法和临时对象创建

c++ - 从函数返回指向对象的指针,而不使用 new 分配指针

c++ - malloc分配的对象动态类型是什么?