☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

用 enum class 取代 enum

5.2.4 ID_forbidUnscopedEnum
目录 › next › previous

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)

参考

C++ Core Guidelines Enum.3
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.