今回は"Strongly typed enumerations"(強い型つけの列挙型)。
今まで、列挙型は整数値として扱われるために、型の違う列挙型同士の比較が可能であるという問題点がありました。
そこで、C++0xではクラス化された列挙型(enum class)が導入されます。enum classは型安全を保ち、暗黙的に整数型に変換されません。さらにenum classは次のようにスコープを指定しなければ列挙名を使うことができません。
enum class Enum1 { A, B }; if ( A == x ) { … } /* Aは未定義なのでエラー */ if ( Enum1::A == x ) { … } /* スコープ指定されているのでOK */
また、次のようにデフォルトでは内部的な型が整数型であるenum classの型を明示的に指定することもできます。
enum class Enum2 : unsigned int { A = 1, B };
さらに、今までの列挙型も上のようなスコープの指定や内部的な型を明示的に指定することができます。
enum Enum3 : unsigned int { A = 1, B}; if ( Enum3::A == x ) { … } /* C++0xではOK */
また、サイズが決定される場合には、enum、enum classは前方宣言をすることも可能になりました。
今のところ言語機能の改良点やライブラリの機能についてはあまり勉強できてないので、その辺も来年はやってみたいですね。もっとも私は現在の規格でのSTLも身についていないので、しっかり勉強しないといけないんですけどね。