enum
enum 是一组 整型 常量的组合
enum color_t { BLACK, BLUE, GREEN };
color_t color = BLUE;
cout << (color == BLACK); // print false
1
2
3
2
3
下面的问题:颜色和水果在语义上不能够拿来比较
enum color_t { BLACK, BLUE, GREEN };
enum fruit_t { APPLE, CHERRY };
color_t color = BLACK; // int: 0
fruit_t fruit = APPLE; // int: 0
cout << (color == fruit); // print 'true'!!
// and, most importantly, does the match between a color and
// a fruit make any sense?
1
2
3
4
5
6
7
2
3
4
5
6
7
enum class 是 C++ 11的数据类型,不会隐式地转为 int 类型
enum class Color { BLACK, BLUE, GREEN };
enum class Fruit { APPLE, CHERRY };
Color color = Color::BLUE;
Fruit fruit = Fruit::APPLE;
// cout << (color == fruit); // compile error
// we are trying to match colors with fruits
// BUT, they are different things entirely
// int a = Color::GREEN; // compile error
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
枚举类可以拿来比较,不支持算数运算
enum color_t { RED, GREEN, BLUE };
enum class Color { RED, GREEN, BLUE };
cout << (Color::RED < Color::GREEN); // print true
int v1 = RED + GREEN; // ok
//int v2 = Color::RED + Color::GREEN; // compile error
1
2
3
4
5
2
3
4
5
枚举类自动升序排序
enum class Color { RED, GREEN = -1, BLUE, BLACK };
// (0) (-1) (0) (1)
Color::RED == Color::BLUE; // true
1
2
3
4
2
3
4
枚举类包含别名
enum class Device { PC = 0, COMPUTER = 0, PRINTER };
1
枚举类可以显式转换
int a = (int) Color::GREEN; // ok
1
可以设置枚举类的大小
#include <cstdint>
enum class Color : int8_t { RED, GREEN, BLUE };
1
2
3
2
3
C++ 17 枚举类支持 直接列表初始化
enum class Color { RED, GREEN, BLUE };
Color a{2}; // ok, equal to Color:BLUE
// Color b{4}; // compile error
1
2
3
2
3
C++ 20 允许在局部作用域中使用枚举标识,减少冗余代码
enum class Color { RED, GREEN, BLUE };
switch (x) {
using enum Color; // C++20
case RED:
case GREEN:
case BLUE:
}
1
2
3
4
5
6
7
2
3
4
5
6
7
枚举类应该进行初始化
enum class Color { RED, GREEN, BLUE };
Color my_color; // "my_color" may be outside RED, GREEN, BLUE!!
1
2
2
C++17 中,将超出范围的值转为枚举类型会导致未定义行为
enum Color { RED, GREEN, BLUE };
Color value = (int) 3; // undefined behavior, "value" is undefined
1
2
2
编辑 (opens new window)
上次更新: 2025/05/21, 06:42:57