2011-06-30 12 views
5

constメンバーと匿名ユニオンを持つことはできますか? G ++ 4.5でconstメンバーを持つコンストラクタと匿名ユニオン

struct Bar { 
    union { 
    struct { const int x, y; }; 
    const int xy[2]; 
    }; 
    Bar() : x(1), y(2) {} 
}; 

私はエラーを取得する:私は、以下の持っている

error: uninitialized member ‘Bar::<anonymous union>::xy’ with ‘const’ type ‘const int [2]’ 
+0

'struct {const int x、y; }; 'は有効ではありませんC++。あなたはGCCで何かできるかどうか尋ねていますか? –

+0

なぜ有効ではありませんか?初期化リストを持つコンストラクタが必要ですか? – user2023370

+0

GCC-pedanticスイッチが便利です。 「ISO C++は匿名の構造体を禁止しています」と言います。上記の 'const'を削除すると、同じ警告が出ます。 – user2023370

答えて

3

これは、バージョン4.6で修正されたGCCの問題でした。あなたのコードは正常に動作するようになりました。

匿名の構造体を使用するのでGCC拡張機能に依存しますが、ほとんどのコンパイラはこれをサポートしています。

struct Bar { 
    union { 
    const int x; 
    const int y; 
    }; 
    Bar() : x(1) {} 
}; 

このコードはまた、クランとVisual Studio 2010で受け入れられている(ただし、2008年で失敗):また、次のコードは、今-pedanticを適切に構築します。

0

はい。その可能性はありますが、構築時に初期化する必要があります。初期化されていないままにすることはできません。しかし、この特定のケースでは、初期化リストの配列を初期化することができないので、私は考えていません。ところで

、この興味深いトピックを見て:

0

号には、GCCの-pedanticスイッチを使用してみてください:

warning: ISO C++ prohibits anonymous structs 

例もそのためであります違法で、constが削除されています。

+0

これは質問に答えるのではないかと心配しています。匿名の構造体は禁止されていますが、匿名の構造体は禁止されています。 –

+0

@SamHocevarありがとうございました!私はあなたの貢献に感謝しますが、確かに答えは技術的にはまだノーです:私は合法的なC + +を探していた。 – user2023370

+0

質問を編集できますか?それは、「答えが肯定されていると思われるconstメンバーとの匿名組合を持つことは可能ですか?匿名の 'struct'sには別の問題があるようです。 –

関連する問題