我将我的宏(这很糟糕,让 child 子害怕,如 Google said )切换到作用域枚举。我认为有作用域枚举很棒。然后我写了这个:
if ((msg.Stamp & RECEIVERS::BROADCAST) != RECEIVERS::BROADCAST)
^^^^^^^^^^^^^^^^^^^^
//do stuff
并且智能感知给我一个奇怪的错误,例如:“表达式必须具有整数类型或无作用域的枚举”。为什么我不能按位和范围枚举来实现?
最佳答案
你可以,但你必须编写自己的运算符重载
RECEIVERS operator&(RECEIVERS l, RECEIVERS r)
{
using underlying = typename std::underlying_type<RECEIVERS>::type;
return static_cast<RECEIVERS>(static_cast<underlying>(l) & static_cast<underlying>(r));
}
内置的二进制 operator&
仅适用于整数类型和无作用域的枚举类型。作用域枚举类型对您如何使用它们有限制,它们的行为不像整数,因此(默认情况下)它们仅支持一组有限的操作。
另外:类型名称 RECEIVERS
在我看来很糟糕,Receivers
有什么问题?我不喜欢将 ALL_CAPS 用于枚举常量的约定,但我更不喜欢将它用于类型名称。
关于c++ - 为什么不能按位和使用作用域枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424775/