2013-04-14 7 views
6

Iは、以下の組合を宣言する:C++ 11では、非匿名の共用体に静的データ・メンバーを含めることはできますか? C++ 11では

union U4 { 
    char c; 
    int i; 
    static int si; 
}; 

Iは-std = C++ 11 -pedantic-エラーを使用してG ++ 4.7.0でこのコードをコンパイルするとき、私は(次のエラーを取得しますマイナー編集):

error: local class ‘union U4’ shall not have static data member ‘int U4::si’ [-fpermissive]
error: ‘U4::si’ may not be static because it is a member of a union

FDIS(N3242)は、明示的には、私の知る限り、名前の組合の静的データメンバを許可していません。しかし、私はFDIS がどこで許可されていないかもわかりません名前付き共用体の静的データメンバーどちらかを "静的でないデータメンバー" [セクション9.5パラグラフ1]で何ができるかを繰り返し参照します。これとは対照的に、この標準では、組合の静的データメンバーが許可されていることが示されています。

私は、組合の静的データメンバーには何の注意もありません。私がそれを必要とするならば、おそらく匿名組合を含むクラスで十分に近い効果を得ることができます。私は標準の意図を理解しようとしています。

ありがとうございました。

+2

まず、ローカルクラスの型は静的なデータメンバ(一般的には '§9.4.2/ 5')を持つことができないので、最初のエラーがどこから来るのでしょうか。非局所的な 'union'内の静的データメンバーの場合、Clangはうまくコンパイルされます。 – Xeo

答えて

4

はいこれが可能です。標準の第9章では、明示的にそうでないと明記しない限り、クラス、構造体および共用体には、単語classを使用しています。スタティック・ユニオン・メンバーの唯一の制限は、ローカル・ユニオン(9.4.2/5)と匿名のユニオン(9.5/5)です。

#include <iostream> 

union Test 
{ 
    static int s; 
}; 

int Test::s; 

int main() 
{ 
    Test::s = 1; 
    std::cout << Test::s; 
} 

出力はLiveWorkSpaceです。 Clang 3.2ではコンパイルされますが、gcc 4.8.0やIntel 13.0.1ではコンパイルされません。これはgcc/Intelのバグです。

+0

sed s/LiveWorkspace/gのIdeone/Outputの出力 – niXman

+0

@niXman tnx、fixed! – TemplateRex

+0

@rhalbersma Wow。いい答え。どうもありがとう。この回答の特別なメリットとして、私は地元の組合と非組合の組合に違いがあることを学びました。ああ、地元の組合が静的なメンバーを持つことができない理由は、ストレージを宣言する方法がないということです。再度、感謝します。 – sschurr

関連する問題