【C++11】スコープ付きenum

通常のenumの列挙子は、その enum が定義されているスコープに属すため、同じスコープに列挙子と同じ名前の変数などがあると名前の衝突が起こります*1

int White;
enum Color { Black, White };  // エラー! White を再定義している

衝突を避けるために、

// こんな感じで頭に型名をつけるとか、
enum Color { Color_Black, Color_White };
Color color = Color_White;

// 構造体などの別のスコープに突っ込むとかする必要がある
struct Color {
    enum ColorType { Black, White };
};
Color::ColorType color = Color::White;

上のような工夫をする必要がありました。


C++11からは、enum classもしくはenum structを使えば、enum型名::列挙子」の形のアクセスができるようになりました(スコープ付き列挙型)。

int White;
enum class Color { Black, White };  // OK

// 型名::列挙子でアクセスする
Color color = Color::White;

スコープ付き列挙型におけるclassstructの間に違いはないらしいです。
また、列挙子単体でのアクセスはできません。

*1:列挙子と同じ名前のクラスなどは定義できる