c++ - 为枚举重载代字号 "~"运算符

标签 c++ c++11 visual-c++ enums c++14

是否可以为枚举定义运算符 ~?例如,我的示例中有枚举状态,我希望能够编写 result &= ~STATE_FAIL;。 我做了这样的事情:

#include <iostream>

    enum State
    {
        STATE_OK                     = 0x0,
        STATE_FAIL                   = 0x1,    
        STATE_LOW                    = 0x2,   
        STATE_HIGH                   = 0x4    
    };

    State & operator|=(State & a, const State b)
    {
        a = static_cast<State>(static_cast<int>(a) | static_cast<int>(b));
        return a;
    }

    State & operator&=(State & a, const State b)
    {
        a = static_cast<State>(static_cast<int>(a) & static_cast<int>(b));
        return a;
    }
     State & operator~(State& a)
    {
        a = static_cast<State>( ~static_cast<int>(a));
        return a;
    }


int main()
{
  State result = STATE_OK;

  result |= STATE_FAIL;    // ok
  result &= STATE_FAIL;    // ok
  result &= ~STATE_FAIL;    // fail

  return 0;
}

我收到以下错误:

In function int main(): Line 35: error: invalid conversion from int to State compilation terminated due to -Wfatal-errors.

最佳答案

您遇到的错误是由于将参数作为非常量引用(无法绑定(bind)到临时对象,表达式 STATE_FAIL 是)引起的。

您的 operator~ 实现也有问题:例如您的 operator~ 修改了参数,这不是 ~ 的常规行为,如图所示 here .

这应该以预期的方式工作,即它不修改它的参数,只返回操作的结果:

State operator~(const State a)
{
    return static_cast<State>(~static_cast<int>(a));
}

关于c++ - 为枚举重载代字号 "~"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42282500/

相关文章:

c++ - 编译时消除虚拟表?

winapi - 以编程方式修改/检测本地安全策略

c++ - c++中令人困惑的事情

c# - 如何为非托管 c dll 创建一个 c++\cli 包装器

c++ - 如果过滤器严格变窄,避免对 QSortFilterProxyModel::filterAcceptsRow() 的冗余调用

c++ - ODBC、ADO 或 OLE DB

c++ - 使用 chrono,时间应该如何存储为变量?

c++ - 在不同的范围内新建和删除

visual-c++ - 通过鼠标单击选项卡捕获选项卡更改事件

android - 未定义对myfunction的引用