C++11強タイプ列挙
3061 ワード
【C++11強タイプ列挙】
標準C++では、列挙タイプはタイプセキュリティではありません.列挙タイプは整数と見なされ、2つの異なる列挙タイプ間で比較できるようにします.C++03が唯一提供するセキュリティメカニズムは、1つの整数または1つの列挙値が暗黙的に別の列挙型に変換できないことである.また、列挙に使用される整数タイプとそのサイズは、実装方法によって定義され、明確に指定できません.最後に,列挙名の全数が一般に露出しているため,C++03の2つの異なる列挙は,同じ列挙名を持つことはできない.(例えばenum Side{Right,Left};enum Thing{Wrong,Right};と一緒に使用できません.)
C++11は,上記の問題を回避できる特別な「列挙クラス」を導入した.enum classの構文を使用して宣言します.
この列挙はタイプが安全である.列挙タイプは暗黙的に整数に変換できない.整数値と比較することもできません.(式
列挙タイプで使用されるタイプは、明示的に指定する必要があります.上記の例では、デフォルトタイプintを使用していますが、他のタイプを指定することもできます.
列挙タイプの語彙範囲(scoping)は、列挙タイプの名前範囲に定義されます.列挙タイプの列挙名を使用する場合は、その属する範囲を明確に指定する必要があります.前述の列挙タイプEnum 2を例にとると、Enum 2::Val 1は有意義な表現であり、単独のVal 1はNOである.
さらに、C++11では、従来の列挙の使用タイプを指定できます.
列挙名Val 1は、Enum 3の列挙範囲(Enum 3::Val 1)に定義されていますが、互換性のため、Val 1は一般的な範囲で単独で使用できます.
C++11では、指定可能なタイプの新しい列挙を使用すれば、列挙タイプの事前宣言(forward declaration)も可能です.以前のC++が列挙の前置き宣言を書くことができなかったのは、列挙パラメータが占める空間の大きさを決定できなかったためであり、C++11はこの問題を解決した.
参照:http://zh.wikipedia.org/wiki/C++0x#.E5.BC.B7.E5.9E.8B.E5.88.A5.E5.88.97.E8.88.89
標準C++では、列挙タイプはタイプセキュリティではありません.列挙タイプは整数と見なされ、2つの異なる列挙タイプ間で比較できるようにします.C++03が唯一提供するセキュリティメカニズムは、1つの整数または1つの列挙値が暗黙的に別の列挙型に変換できないことである.また、列挙に使用される整数タイプとそのサイズは、実装方法によって定義され、明確に指定できません.最後に,列挙名の全数が一般に露出しているため,C++03の2つの異なる列挙は,同じ列挙名を持つことはできない.(例えばenum Side{Right,Left};enum Thing{Wrong,Right};と一緒に使用できません.)
C++11は,上記の問題を回避できる特別な「列挙クラス」を導入した.enum classの構文を使用して宣言します.
enum class Enumeration
{
Val1,
Val2,
Val3 = 100,
Val4 /* = 101 */,
};
この列挙はタイプが安全である.列挙タイプは暗黙的に整数に変換できない.整数値と比較することもできません.(式
Enumeration::Val4 == 101
はコンパイル期間エラーをトリガーすることを示す).列挙タイプで使用されるタイプは、明示的に指定する必要があります.上記の例では、デフォルトタイプintを使用していますが、他のタイプを指定することもできます.
enum class Enum2 : unsigned int {Val1, Val2};
列挙タイプの語彙範囲(scoping)は、列挙タイプの名前範囲に定義されます.列挙タイプの列挙名を使用する場合は、その属する範囲を明確に指定する必要があります.前述の列挙タイプEnum 2を例にとると、Enum 2::Val 1は有意義な表現であり、単独のVal 1はNOである.
さらに、C++11では、従来の列挙の使用タイプを指定できます.
enum Enum3 : unsigned long {Val1 = 1, Val2};
列挙名Val 1は、Enum 3の列挙範囲(Enum 3::Val 1)に定義されていますが、互換性のため、Val 1は一般的な範囲で単独で使用できます.
C++11では、指定可能なタイプの新しい列挙を使用すれば、列挙タイプの事前宣言(forward declaration)も可能です.以前のC++が列挙の前置き宣言を書くことができなかったのは、列挙パラメータが占める空間の大きさを決定できなかったためであり、C++11はこの問題を解決した.
enum Enum1; // C++ C++11;
enum Enum2 : unsigned int; // C++11
enum class Enum3; // C++11, int
enum class Enum4: unsigned int; // C++11
enum Enum2 : unsigned short; // C++11,Enum2 unsigned int
参照:http://zh.wikipedia.org/wiki/C++0x#.E5.BC.B7.E5.9E.8B.E5.88.A5.E5.88.97.E8.88.89