にゃははー

はへらー

「ご趣味は?」 「えぇ、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の時だけ特殊化して何もしない様にできないもんかね。すごい無駄な気がしてならないのだが。