C++0x enumの先行宣言

C++0xでは、structやclassと同様に、enumも先行宣言できるようになります。

以下のようなヘッダーファイルがあった場合

// Color.h

enum Color {
  /* 多くの列挙子... */
};

void draw(Color& color);

draw関数の宣言にはColor内の列挙子を必要としませんが、
C++03ではenumを先行宣言することができないので
Colorの列挙子を変更したら関連する全てのファイルの再コンパイルが必要になります。



C++0xでは、enumの先行宣言が許可されるので、
以下のように書くことができるようになります。

// Color.h

enum Color : int;

void draw(Color& color);
// Color.cpp

enum Color : int {
    /* 多くの列挙子... */
};

void draw(Color& color)
{
    ...
}

このように書けると、Colorの列挙子を変更しても
再コンパイルが必要になるのはColor.cppだけで済みます。


enumの先行宣言をするには、ベースとなる型(整数型)を指定する必要があります。

enum E;       // エラー!
enum E : int; // OK

enumの再宣言をするときは、ベース型が同じである必要があります。

enum E : int;

enum E : short; // エラー!ベース型が一致していない
enum E : int;   // OK

また、enumの先行宣言は、スコープ付きのenumであるenum classにも適用されます。

enum class E : int; // OK


さらに、クラスや名前空間で宣言したenumも、スコープ指定して定義できます。

struct S {
  enum E : int;
  E e;
};

enum S::E : int {
  ...
};

N2764 Forward declaration of enumerations (rev. 3)

C++0x言語拡張まとめ