位字段枚举的过载否定运算符

时间:2017-09-07 02:11:05

标签: c++ enums operator-overloading

我有一个类,其中有几个成员是enum类型的位字段。我想重载enum的否定运算符,因为出于实现原因,我不能使用实际为零的值作为空状态。但看起来 operator!没有得到位字段,但如果值不是位字段,它似乎工作得很好。我错过了比特字段有什么特别之处吗?

这是一个测试代码(具有相同数量的enum值):

#include <iostream>

#define TEST(var) std::cout << #var " = " << var << std::endl;

struct flags {
  enum field { f0, f1, no_field };
  field b0 : 4;
  field b1 : 4;
  field a0, a1;
};

inline bool operator!(flags::field f) {
  std::cout << "(!) ";
  return f == flags::no_field;
}

int main() {
  flags f;
  f.b0 = flags::f0;
  f.b1 = flags::f1;
  f.a0 = flags::f0;
  f.a1 = flags::f1;

  std::cout << "******** test enum values" << std::endl;

  TEST( flags::f0 ) // 0
  TEST( flags::f1 ) // 1
  TEST( flags::no_field ) // 2
  TEST( !flags::f0 ) // (!) 0
  TEST( !flags::f1 ) // (!) 0
  TEST( !flags::no_field ) // (!) 1

  std::cout << "\n******** test regular members" << std::endl;

  TEST( f.a0 ) // 0
  TEST( f.a1 ) // 1
  TEST( !f.a0 ) // (!) 0
  TEST( !f.a1 ) // (!) 0

  std::cout << "\n******** test bit field members" << std::endl;

  TEST( f.b0 ) // 0
  TEST( f.b1 ) // 1
  TEST( !f.b0 ) // expected "(!) 0", but got "1"
  TEST( !f.b1 ) // expected "(!) 0", but got "0"
}

这是我得到的输出[Wandbox]

******** test enum values
flags::f0 = 0
flags::f1 = 1
flags::no_field = 2
!flags::f0 = (!) 0
!flags::f1 = (!) 0
!flags::no_field = (!) 1

******** test regular members
f.a0 = 0
f.a1 = 1
!f.a0 = (!) 0
!f.a1 = (!) 0

******** test bit field members
f.b0 = 0
f.b1 = 1
!f.b0 = 1
!f.b1 = 0

从比特字段成员的测试输出中可以看出,&#34;(!)&#34;没有打印,积分值被否定,而是与flags::no_field进行比较。

修改:我已提交GCC错误report

0 个答案:

没有答案