C++ 它';使用赋值很危险,因为前面的值无效

C++ 它';使用赋值很危险,因为前面的值无效,c++,C++,对未初始化的数据使用赋值是否危险 在使用赋值运算符时,何时应格外小心 我问这个问题的原因是因为我在看视频,他显示了预期的类,该类要么有值,要么有异常。移动构造函数定义为 Expected(Expected&& rhs) : .. { if (gotHam) new(&ham) T(std::move(rhs.ham)); ... union { T ham; std::exception_ptr spam; }; 其中ham定义为 Ex

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

在使用赋值运算符时,何时应格外小心

我问这个问题的原因是因为我在看视频,他显示了
预期的
类,该类要么有值,要么有异常。移动构造函数定义为

Expected(Expected&& rhs) : .. {
    if (gotHam) new(&ham) T(std::move(rhs.ham));
    ...
union {
    T ham;
    std::exception_ptr spam;
};
其中
ham
定义为

Expected(Expected&& rhs) : .. {
    if (gotHam) new(&ham) T(std::move(rhs.ham));
    ...
union {
    T ham;
    std::exception_ptr spam;
};
他解释了使用placement new的原因,并在28:49表示,由于他使用的是工会,因此他必须格外小心管理初始化。然后,他在29:14进一步声明:

我无法使用作业,因为作业假定 以前的值是有效的

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

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

我认为这可能与联合有关,而且这个类还没有初始化,但我仍然没有看到作业中的危害。为什么赋值会关心前面的值呢?

他的意思是T的构造函数从未运行过。因此,您不能以任何方式使用ham对象。我所知道的唯一一种方法是,在没有运行构造函数的情况下,正式拥有一个可用的命名对象


这就是为什么我不认为工会在C++程序中有任何地方。

认为T是管理内存的类,但是构造函数从来没有被执行过。@ RICHADHODHGEDS好点-我理解的是,一个运算符=将创建那个数据,类似于构造函数是如何构造的。但是我猜操作符=可能会假定这些构造是由以前的构造函数创建的,因此跳过该步骤。我走对了吗?:)工会不承担任何义务。这只是记忆。如何初始化和使用该内存取决于您。这就是为什么Andrei的例子有一个标志——告诉周围的代码哪个成员是有效的。我不理解的是操作符=是如何“使用”对象的。运算符=的工作方式是否与构造函数类似,即它将数据分配给对象?否。运算符=是一个赋值运算符,它使用已构造的对象。@默认情况下,与构造函数类似的运算符是复制构造函数,不是赋值运算符。所以危险在于使用T中已经存在的数据,这些数据是由某个构造函数创建的。我想我明白了。谢谢你也指出,只有工会创造了这些场景。