C++0x 無制限Union

union のメンバに対する制限が(とくに制限する理由もなかったので)解除され、

参照以外の全ての型を持つことができるようになる

union U {
    int i;
    float f;
    std::string s; // 今まではできなかった
};


今まではこの制限のためにテンプレートやキャストを使っていたが

今回の変更で union がより強力でより便利になる



注意事項
・参照型をメンバにすることはできない
・静的メンバを持つことができる
・メンバ関数を持つことはできるが、仮想関数を持つことはできない
・基本クラスを持ってはならない
・基本クラスとして使用されてはならない
・ある共用体のメンバ、もしくはあるクラス内の匿名共用体のメンバに対して
 non-trivial な特殊メンバ関数が定義された場合、その特殊メンバ関数は
 その共用体またはクラスに対して、 deleted 定義される
・暗黙に deleted 定義された関数を、 defaulted にすることはできない



※ 特殊メンバ関数 : コンストラクタ、コピーコンストラクタ、コピー代入演算子、デストラクタ
※ non-trivial な特殊メンバ関数 : コンパイラが自動生成したものではなく、ユーザーが明示的に定義した特殊メンバ関数
※ non-trivial は訳すなら「非自明な〜」でいいのかな



N2544 Unrestricted Unions (Revision 2)

C++0x言語拡張まとめ