【问题标题】:Overloading the tilde "~" operator for enums为枚举重载波浪号“~”运算符
【发布时间】:2017-02-16 19:02:00
【问题描述】:

是否可以为枚举定义运算符波浪号~?例如,我的示例中有枚举状态,我希望能够编写 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 行:错误:无效转换 intState 编译由于 -Wfatal-errors 而终止。

【问题讨论】:

  • 枚举的转换在另一个问题中,但它没有显示按值获取参数并返回值而不是@tuple_cat 的答案中的引用对于这个问题。这在创建正确的 bitwise NOT operator~ 时很重要。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 在玩过这个例子之后,似乎有一个非 const State &amp; 作为operator~ 的参数会阻止它被使用。这个答案是正确的,你必须摆脱引用。
  • 将非常量 ref 作为参数并不会阻止使用 operator~。正如答案中所解释的,它只阻止临时变量(右值表达式)作为参数传递,因为右值不能作为非常量引用传递。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2012-04-22
相关资源
最近更新 更多