【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;
スコープ付き列挙型におけるclass
とstruct
の間に違いはないらしいです。
また、列挙子単体でのアクセスはできません。
*1:列挙子と同じ名前のクラスなどは定義できる