C++11強類型枚舉

C++11強類型枚舉】  安全

  在標準C++中,枚舉類型不是類型安全的。枚舉類型被視爲整數,這使得兩種不一樣的枚舉類型之間能夠進行比較。C++03 惟一提供的安全機制是一個整數或一個枚舉型值不能隱式轉換到另外一個枚舉別型。 此外,枚舉所使用整數類型及其大小都由實現方法定義,皆沒法明確指定。 最後,枚舉的名稱全數暴露於通常範圍中,所以C++03兩個不一樣的枚舉,不能夠有相同的枚舉名。 (比如 enum Side{ Right, Left }; 和 enum Thing{ Wrong, Right }; 不能一塊兒使用。)ide

C++11 引進了一種特別的 "枚舉類",能夠避免上述的問題。使用 enum class 的語法來聲明:spa

enum class Enumeration
{
  Val1,
  Val2,
  Val3 = 100,
  Val4 /* = 101 */,
};

此種枚舉爲類型安全的。枚舉類型不能隱式地轉換爲整數;也沒法與整數數值作比較。 (表示式 Enumeration::Val4 == 101 會觸發編譯期錯誤)。code

枚舉類型所使用類型必須顯式指定。在上面的示例中,使用的是默認類型 int,但也能夠指定其餘類型:ip

enum class Enum2 : unsigned int {Val1, Val2};

枚舉類型的語彙範圍(scoping)定義於枚舉類型的名稱範圍中。 使用枚舉類型的枚舉名時,必須明確指定其所屬範圍。 由前述枚舉類型 Enum2 爲例,Enum2::Val1是有意義的表示法, 而單獨的 Val1 則否。get

此外,C++11 容許爲傳統的枚舉指定使用類型:io

enum Enum3 : unsigned long {Val1 = 1, Val2};

枚舉名 Val1 定義於 Enum3 的枚舉範圍中(Enum3::Val1),但爲了兼容性, Val1 仍然能夠於通常的範圍中單獨使用。編譯

在 C++11 中,枚舉類型的前置聲明 (forward declaration) 也是可行的,只要使用可指定類型的新式枚舉便可。 以前的 C++ 沒法寫出枚舉的前置聲明,是因爲沒法肯定枚舉參數所佔的空間大小, C++11 解決了這個問題:class

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兼容性

相關文章
相關標籤/搜索