web-dev-qa-db-ja.com

C ++クラスでの静的列挙型と列挙型の宣言

以下に示すようなクラス宣言内で定義された場合のstatic enum定義とenum定義の違いは何ですか?

class Example
{
     Example();
     ~Example();

     static enum Items{ desk = 0, chair, monitor };
     enum Colors{ red = 0, blue, green };
}

また、クラスで型を定義しているので、それらを何と呼びますか?同様に、クラスで変数を定義する場合、それをメンバー変数と呼びます。

14
user3731622

staticenum宣言に適用できないため、コードは無効です。

N3337以降、§7.1.1/ 5[dcl.stc]

static指定子は、変数と関数の名前と匿名の共用体にのみ適用できます...

enum宣言はそれらのどれでもありません。

enumのインスタンスを作成し、必要に応じてstaticにすることができます。

class Example
{
     enum Items{ desk = 0, chair, monitor };
     static Items items; // this is legal
};

この場合、itemsは他の 静的データメンバー と同じです。


これは MSVCバグ ;です。リンクされたバグレポートから、コンパイラはstatic宣言でregisterenumの両方のストレージ指定子を許可するようです。バグは修正済みとしてクローズされているため、VS2015で修正が利用可能になる可能性があります。

14
Praetorian

staticはC++ストレージ指定子です。これは、クラスのこのメンバーの値がクラスのすべてのインスタンスで同じであることを意味します。ここでは列挙型について特別なことは何もありません。

編集:staticタグのwikiにも説明があります。まさにこのトピックについて。

EDIT2:ああ、私はあなたのコードを誤解しました。静的な列挙型はありません。値を保持する列挙型の静的変数を持つことができます。

0
Marcus Müller