我有一个类,其中有几个成员是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。