为什么不能按位使用scoped enum?

时间:2014-05-02 09:22:36

标签: c++ visual-studio c++11

我切换了我的宏(这是糟糕的,让小孩子害怕,像谷歌said)来限制枚举。我认为有一个范围枚举很棒。然后我写了这个:

if ((msg.Stamp & RECEIVERS::BROADCAST) != RECEIVERS::BROADCAST)
                 ^^^^^^^^^^^^^^^^^^^^
//do stuff

和intellisense给我一个奇怪的错误,例如:"表达式必须具有整数类型或未包含的枚举"。为什么我不能按位和使用作用域枚举?

1 个答案:

答案 0 :(得分:2)

你可以,但你必须编写自己的运算符重载

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&仅适用于整数类型和未范围的枚举类型。 Scoped枚举类型对如何使用它们有限制,它们的行为不像整数,所以(默认情况下)它们只支持一组有限的操作。

除此之外:类型名称RECEIVERS对我来说太可怕了,Receivers出了什么问题?我不喜欢将ALL_CAPS用于枚举器常量的惯例,但我更喜欢它的类型名称。