次のコードの場合:
class Foo{
int foo;
public:
Foo() : foo(13) {}
int getFoo() const { return foo; }
};
union Bar{
Foo fBar;
double dBar;
};
これは C++ では完全に合法だと思います。http://en.cppreference.com/w/cpp/language/union#Explanation言います:
2 つの共用体メンバーが標準レイアウト型である場合、任意のコンパイラで共通のサブシーケンスを調べることが明確に定義されています
したがって、gccでこれを行うことができます:
Bar bar = { Foo() }
Visual Studio 2008 でこれを試すと、次のエラーが表示されます。
エラー C2620: のメンバー
Bar::fBar
に、union Bar
ユーザー定義のコンストラクターまたは重要な既定のコンストラクターがあります
エラー C2620は次のように述べています。
ユニオン メンバーは、既定のコンストラクターを持つことはできません。
何が起きてる?これは C++ の要件だったのですか? Standard Layout が唯一の要件だと思いましたか? これに対する回避策はありますか?