August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
使用enum class定义的枚举也被称为是“作用域枚举”(scoped enumeration),除此之外,还有一种称为“平坦”(plain)枚举的定义,和作用域枚举的区别是,平坦枚举将它的枚举量都隐式导出到枚举类型所在的作用域里,并且可以隐式转换到int型。例如:
很明显,平坦枚举没有作用域枚举严格。平坦枚举的枚举量能“污染”枚举类型所在的作用域。有时候这很方便,有时也会导致混乱。例如,当你试图同时使用Month和iostream格式化机制(11.2.1节)时,会发现代表12月(December)的dec和代表十进制(decimal)的dec有冲突。
类似地,允许枚举值转换为int值在使用上会很方便(当我们想转换枚举量到int时无须再显式进行),但有时也会导致诧异。例如:
如果Month是enum class,两个if条件都不会被成功编译。如果monday是平坦枚举量(而不是作用域枚举量),那么month和Monday的比较是允许的,但很可能这会导致意外结果。
我们倾向于使用更简单、更安全的作用域枚举类型,少用平坦枚举类型,但是在旧的代码中有很多平坦枚举量,这是因为enum class是C++11中新出现的功能。