c++ - 为什么不能按位和使用作用域枚举?

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

我将我的宏(这很糟糕,让 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/

相关文章:

sql - 我可以使用 SQL Server Project 来比较仅在某些存储过程中的差异吗?

c# - 数据没有出现在特定的表中,只有一个表有数据

visual-studio - 如何使数据文件可用于单元测试?

c++ - boost::shared_mutex 多读/单写互斥

c++ - 每个进程的最大 std::shared_ptr 管理对象数

c++ - 可以安全地使用复制/移动构造函数来实现复制/移动赋值运算符吗?

c++ - 在 C++ 中, "class instance"是唯一的对象类型吗?

c++ - this* 在 make_unique 中的用法

c++ - 覆盖 c 字符串时发生访问冲突

c++ - 我对这个问题有疑问我的输出不正确