「ご趣味は?」 「えぇ、GCCのバグ探しをたしなむ程度に」
タイトルはあんま関係ない。
gcc (GCC) 4.6.0 20101031 (experimental) でのこと。
unrestricted unionsを試してみたら怒られた。
以下コード。
#include <string> union U { std::string str; }; U u;
U::U()がdeletedだそうな。で、n2544を読むと、C++0x 無制限Union - Faith and Brave - C++で遊ぼうここでの会話にもあるとおり、non-trivialな特殊関数があった場合はunionのその特殊関数がdeletedになるということらしい。
つまり修正した以下のコードは通る。
#include <string> union U { U( void ) {} ~U( void ) {} std::string str; }; U u;
注意なのはU( void ) = defaultだとダメということ。暗黙的にdeletedになった特殊関数はdefault指定できないらしい。
でも、何もしないctorとか書くだけ面倒だし、第一u.strにアクセスする前にplacement newを使って明示的にコンストラクタを呼ばなければならないとか。結局初期化されてないんだからtrivialな特殊関数の定義をunionの時だけ特殊化して何もしない様にできないもんかね。すごい無駄な気がしてならないのだが。