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