0%

cpp-enum class

1. 之前 enum 的问题

1.1. enum中的字段作用域是外部可见

1
2
3
4
5
6
7
8
9
10
11
enum A {
CAT,
DOG,
};

enum B {
CAT, // 1. 跟A同名,编译失败
SHEEP,
};

int CAT=10; // 2. 不能用CAT命名变量,编译失败

相当于 enum 中的字段作用域没有限定到括号内。

1.2. enum中的字段不是类型安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum A {
CAT = 0,
DOG,
};

enum B {
RED = 0,
BLUE,
};

A a = CAT;
B b = RED;

if (a == b) // 判断正确,最多报1个类型不匹配的 warning
{
cout << "equal";
}

2. cpp11改进方案

增加了一个 enum class 语法,将 enum 限定为具体类型,

2.1. 对字段限定作用域

1
2
3
4
5
6
7
8
9
enum class A {
CAT,
DOG,
};

enum class B {
CAT,
SHEEP, // 不会再出错
};

2.2. 可以精确控制底层实现类型

1
2
3
4
enum class A: char { // 明确使用 char 类型
BLUE,
RED,
};