枚举和二进制或运算符 (MISRA C++ 2008, 4-5-2)

Enums and binary or operator (MISRA C++ 2008, 4-5-2)

MISRA C++ 2008,4-5-2 指出:枚举类型的表达式不得用作除下标运算符 [ ]、赋值运算符 =、相等运算符 == 和以外的内置运算符的操作数!=、一元 & 运算符 和关系运算符 <、<=、>、>=。

如果可以使用&为什么不允许使用二进制 |用枚举?

你在做一个错误的比较。

一元 & 是 "address-of" 运算符,与 二元 & "and" 运算符无关。

MISRA 规则禁止对枚举进行所有按位运算,但继续允许获取此类对象的地址。

正如在另一个答案中指出的那样,您混淆了 binary & 与 unary &.

不能使用二进制的原因 |和枚举上的其他按位运算符是枚举类型(枚举类型的变量)具有实现定义的大小和符号。并且枚举常量(枚举列表中的值)始终具有类型 signed int.

在任何一种情况下,对有符号数使用任何形式的按位运算总是有问题的:您可能会得到意想不到的结果或调用定义不明确的行为。这是该规则旨在防止的主要问题。

MISRA 还以相同的理由禁止了常规算术:不要对您不知道其大小和符号的类型进行算术运算。不太可能导致错误,但我想如果你做像 enum { X=30000 }; ... X + X 这样奇怪的事情,它就有一个地方。这是明确定义的,还是对 int 的隐式提升,或者由于整数溢出而未定义?这可能是这两种情况之一,它不一定与 CPU 数据大小有关。