不应对枚举对象声明位域
6.9.4 ID_forbidEnumBitfield
枚举类型的底层整数类型以及是否存在符号位由实现定义,与位域结合易导致意料之外的错误。
示例:
enum E {
A, B, C, D
};
struct X {
E e: 2; // Non-compliant
};
int main() {
X x;
x.e = D;
if (x.e == D) { // What is output?
cout << "OK";
} else {
cout << "Oops";
}
}
可能输出 Oops。例中枚举项的取值范围是 [0, 3],位域长度为 2 即可满足这个范围,但如果位域有符号位,会导致意料之外的问题,如用 D 对 x.e 赋值,但 x.e == D 的结果却是 false (因为 D 的值为 3 而 x.e 的值为 -1)。
例外:
enum E: unsigned { // Explicit underlying type
A, B, C, D
};
struct X {
E e: 2; // Compliant
};
在遵循 C++11 及之后标准的代码中,如果显式指定了枚举类型的的底层类型,可不受本规则限制。
相关
依据
ISO/IEC 9899:1999 6.7.2.2(4)-implementation
ISO/IEC 9899:2011 6.7.2.2(4)-implementation
ISO/IEC 14882:2011 7.2(6)-implementation
ISO/IEC 14882:2017 10.2(7)-implementation
参考
MISRA C++ 2008 9-6-3