有作用域枚举

1
2
3
4
5
6
7
8
9
10
11
enum struct|class 名字 { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , ... }
// 声明底层类型为 int 的有作用域枚举类型(关键词 class 与 struct 完全等价)

enum struct|class 名字 : 类型 { 枚举项 = 常量表达式 , 枚举项 = 常量表达式 , ... }
// 声明底层类型为 类型 的有作用域枚举类型

enum struct|class 名字 ;
// 底层类型为 int 的有作用域枚举类型的不可见枚举声明

enum struct|class 名字 : 类型 ;
// 底层类型为 类型 的有作用域枚举类型的不可见枚举声明

每个 枚举项 都成为该枚举的类型(即 名字)的具名常量,它被该枚举的作用域所包含,且可用作用域解析运算符访问。没有从有作用域枚举项到整数类型的隐式转换,尽管 static_cast 可以用来获得枚举项的数值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum class Color { red, green = 20, blue };
Color r = Color::blue;

switch(r)
{
case Color::red : std::cout << "红\n"; break;
case Color::green: std::cout << "绿\n"; break;
case Color::blue : std::cout << "蓝\n"; break;
}

// int n = r; // 错误:不存在从有作用域枚举到 int 的隐式转换
int n = static_cast<int>(r); // OK, n = 21

enum class Type { General, Light, Medium, Heavy };

enum class TypeC :char { General, Light, Medium, Heavy };
enum class TypeUI :unsigned int { General, Light, Medium, Heavy };