我对无限制工会及其在实践中的应用有一些疑问。假设我有以下代码:
struct MyStruct
{
MyStruct(const std::vector<int>& a) : array(a), type(ARRAY)
{}
MyStruct(bool b) : boolean(b), type(BOOL)
{}
MyStruct(const MyStruct& ms) : type(ms.type)
{
if (type == ARRAY)
new (&array) std::vector<int>(ms.array);
else
boolean = ms.boolean;
}
MyStruct& operator=(const MyStruct& ms)
{
if (&ms != this) {
if (type == ARRAY)
array.~vector<int>(); // EDIT(2)
if (ms.type == ARRAY)
new (&array) std::vector<int>(ms.array);
else
boolean = ms.boolean;
type = ms.type;
}
return *this;
}
~MyStruct()
{
if (type == ARRAY)
array.~vector<int>();
}
union {
std::vector<int> array;
bool boolean;
};
enum {ARRAY, BOOL} type;
};
- 这段代码有效吗:)?
- 每次我们使用布尔值时是否有必要显式调用向量析构函数(如此处所述http://cpp11standard.blogspot.com/2012/11/c11-standard-explained-1-unrestricted.html)
- 为什么需要一个新的展示位置,而不是只做类似 'array = ms.array' 的事情?
编辑:
- 是的,它编译
- “在匿名联合中声明的成员实际上是包含类的成员,并且可以在包含类的构造函数中初始化。” (具有重要成员的 C++11 匿名联合)
- 按照建议添加显式析构函数会导致 SIGSEV 与 g++ 4.8 / clang 4.2