在 C++11 中引入了 '作用域枚举' 机制 — 关键字 enum class。
与经典的 enum 的主要区别:
enum class MyE : uint8_t { ... };)。为什么需要: 提高类型安全性,防止名称冲突,错误比较和显式管理存储。
示例:
enum Color { Red, Green }; Color c = Red; // 普通 enum,Red 在全局可见 enum class State { Off, On }; State s = State::On; // 必须指定 State::On
不能写:
enum class State { Off, On }; int x = State::On; // 错误!只能通过自定义转换 int y = static_cast<int>(State::Off); // OK
为什么不能对不同 enum class 的值进行逻辑比较,即使它们的名称和底层类型相同?
答复:
类型安全:每个 enum class 都是一个独立的类型,即使底层类型相同且枚举值名称相同,编译器会将其视为不同的类型,并不允许隐式比较。
故事
在一个控制机床的项目中,从 enum 迁移到 enum class 时,忘记在日志输出值时添加显式转换。日志开始显示“外来”值(未能将 State::On 识别为数字),这使调试变得复杂。
故事
在 REST 服务中,在将普通 enum 迁移到 enum class 后,代码比较了来自不同 enum class 的不同枚举值。编译器阻止了这一点,自动测试无法通过。
故事
在审计系统中,开发人员混淆了旧语法和新语法—有时意外声明了 enum class,但使用了不带限定符的枚举值,结果编译的是错误的代码,或因名称重复而出现链接错误。