【C++11強類型枚舉】
在標准C++中,枚舉類型不是類型安全的。枚舉類型被視為整數,這使得兩種不同的枚舉類型之間可以進行比較。C++03 唯一提供的安全機制是一個整數或一個枚舉型值不能隱式轉換到另一個枚舉別型。 此外,枚舉所使用整數類型及其大小都由實現方法定義,皆無法明確指定。 最后,枚舉的名稱全數暴露於一般范圍中,因此C++03兩個不同的枚舉,不可以有相同的枚舉名。 (好比 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)定義於枚舉類型的名稱范圍中。 使用枚舉類型的枚舉名時,必須明確指定其所屬范圍。 由前述枚舉類型 Enum2 為例,Enum2::Val1是有意義的表示法, 而單獨的 Val1 則否。
此外,C++11 允許為傳統的枚舉指定使用類型:
enum Enum3 : unsigned long {Val1 = 1, Val2};
枚舉名 Val1 定義於 Enum3 的枚舉范圍中(Enum3::Val1),但為了兼容性, Val1 仍然可以於一般的范圍中單獨使用。
在 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
