为枚举

时间:2017-02-16 19:02:00

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

是否可以为枚举定义运算符tilde ~?例如,我的示例中包含enum State,我希望能够编写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;
}

我收到以下错误:

  

在功能int main()中:第35行:错误:转换无效   由于-Wfatal-errors,intState编译终止。

1 个答案:

答案 0 :(得分:3)

您获得的错误是由于将参数作为非const引用(不能绑定到临时表,STATE_FAIL表达式)引起的。

您的operator~实施中也出现了问题:例如:您的operator~修改了~的常规常规行为参数,如here所示。

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

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