無制限の労働組合とその実際の適用についていくつか質問があります。次のコードがあるとします。
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' のようなことをするだけでなく、配置 new が必要なのはなぜですか?
編集:
- はい、コンパイルされます
- 「匿名共用体内で宣言されたメンバーは、実際には包含クラスのメンバーであり、包含クラスのコンストラクターで初期化できます。」(非自明なメンバーを持つ C++11 の無名共用体)
- 提案されているように明示的なデストラクタを追加すると、g++ 4.8 / clang 4.2 で SIGSEV が発生します