c++ - 是否允许从具有不确定值的对象进行分配?

标签 c++ initialization

考虑以下类,它可以处于“非空”或“空”状态,并且在“空”状态下,另一个成员默认初始化(因此具有不确定的值):

struct MaybeInt {
  bool has_value;
  int value;

  MaybeInt()      : has_value(false) {}
  MaybeInt(int v) : has_value(true ), value(v) {}
};

是否允许从默认构造的 MaybeInt 赋值,如:

MaybeInt empty, another;
another = empty; // OK?

建筑怎么样?

MaybeInt empty, another(empty); // OK?

如果 MaybeInt::value 的类型为 char,答案会改变吗?

最佳答案

another = empty 确实是 UB 因为 empty.value 有一个 indeterminate value并且因为 implicitly defined copy constructor of a class复制所有成员。

诀窍是将成员 value 放在 union 中。这样implicitly defined copy constructor of the union复制 object representation :

struct MaybeInt {
  bool has_value;
  union {
    int value;
    char _dumb;
    };

  MaybeInt()      : has_value(false) {}
  MaybeInt(int v) : has_value(true ), value(v) {}
  };

注意:这是一个低级别的技巧,可以让一个可选项简单地复制。这对于代码执行速度非常重要。此类可以通过 cpu 寄存器上的函数调用传递,但如果它不是简单可复制的,则这是不可能的。

关于c++ - 是否允许从具有不确定值的对象进行分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56858341/

相关文章:

c++ - 将文本读入字符串与直接用文本初始化字符串

python - 如何在没有元类的情况下将不同的参数传递给 __new__ 与 __init__

ios - 使用所需的 init(nscoder) 时从代码设置物理体

java - 派生类的类变量的初始化/实例化和调用基类构造函数的顺序

c++ - 如何检测 Windows 系统托盘的变化?

c++ - 当构造函数具有相同的参数类型(文件路径)时,如何从数组创建(初始化)std::tuple

c++ - 文本来自 QPushButton 时如何启用 QLineEdit 编辑?

python - MPI Newbie - 关于 'mpirun' 工作原理和进程管理的一些问题

c++ - 将文本十六进制转换为真正的十六进制表示 C++

c++ - 在用 C++ 编写这个对象数组时,我做错了什么?