用 enum class 取代 enum
5.2.4 ID_forbidUnscopedEnum
enum 受到的限制较为宽松,易造成混淆或冲突等问题,在 C++ 代码中应改用 enum class。
示例:
enum E { // Non-compliant
e0 = 0,
e1 = 1,
e2 = -1
};
E foo();
if (foo()) { // ‘e1’ or ‘e2’??
....
}
enum 往往可以与整数类型随意转换,如果 e0 和 e2 表示某种错误情况,e1 表示正确情况,那么例中对 foo 函数返回值的判断就是错误的,这也是一种常见问题。
C++11 提出的 enum class 会受到更严格的类型和作用域限制,在 C++ 代码中应尽量使用 enum class:
enum class E { // Compliant
e0 = 0,
e1 = 1,
e2 = -1
};
if (foo() == E::e1) { // OK
....
}
if (foo()) { // Compile error, cannot cast the enum class casually
....
}
enum class 不能隐式转为整数类型,使用相关枚举项时也需要声明其所属枚举类型的名称,以避免名称冲突。
依据
ISO/IEC 14882:2011 7.2(2)
ISO/IEC 14882:2017 10.2(2)