我的代码无法使用gcc 4.9.2编译
#include <stdio.h>
enum fooEnum
{
foo1 = 1 << 0,
foo2 = 1 << 1,
foo3 = 1 << 2,
};
int main()
{
fooEnum foo {};
int bar;
bar = foo1;
foo |= (fooEnum) bar; // fails
printf("foo=%d\n", foo);
}
编译命令:gcc -std=c++11 -Wall -Wextra -Werror enum.cpp -c
错误消息是:
enum.cpp: In function ‘int main()’:
enum.cpp:16:6: error: invalid conversion from ‘int’ to ‘fooEnum’ [-fpermissive]
foo |= (fooEnum) bar;
^
将行更改为
foo = (fooEnum) bar;
工作正常。为什么我不能使用OR位?如您所见,fooEnum
是bit enum
。
更新
将代码更改为
fooEnum foo = foo2;
int bar;
bar = foo1 | foo;
foo = (fooEnum) bar;
工作,输出应该是3
。
答案 0 :(得分:1)
以下一行:
foo |= (fooEnum) bar;
相当于:
foo = foo | (fooEnum) bar;
按位OR运算符使其参数被视为int
类型(通过整数提升规则)。因此,赋值的右侧将计算为int
类型的值。这不能直接分配给fooEnum
实例foo
,因此编译器会标记错误。