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