C枚举类型 enum,没有限定作用域。C++11中引入了限定作用域的枚举类型enum class(与enum struct 等价)。
- 在相同作用域中,enum枚举成员名不可重复,即
{
enum enum1 {yellow, red};
enum enum2 {yellow, blue};
enum1 e = yellow; //必须使用该种赋值方式。
}
报错
In function 'int main()':
58:13: error: 'yellow' conflicts with a previous declaration
enum enum2{yellow, blue};
^~~~~~
57:16: note: previous declaration 'main()::enum1 yellow'
enum enum1{yellow, red};
- enum class 可以重复,即:
{
enum class enum1 {yellow, red};
enum class enum2 {yellow, blue};
enum1 e = enum1::yellow;//使用该种赋值方式,注意与enum比较
}
编译通过正常运行。
- 枚举成员默认类型为int,可指定枚举成员类型:
{
enum class enum1 : unsigned int {yellow = 1, red};
enum enum2: char {yellow = 3, blue = 5};
}
- enum成员支持隐式转换,enum class不支持,因为enum class与class相同,定义了一种新的类型
//编译通过
char t = yellow;
//error: cannot convert 'main()::enum1' to 'unsigned int' in initialization
unsigned int t2 = enum1::yellow;
- 枚举类型的前置声明,enum必须指定类型
enum class enum1;
enum enum2:int;
//error: use of enum 'enum3' without previous declaration
enum enum3;