位OR中的枚举转换错误

时间:2015-04-12 01:13:56

标签: c++11 gcc enums bit

我的代码无法使用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位?如您所见,fooEnumbit enum

更新

将代码更改为

    fooEnum foo = foo2;
    int bar;

    bar = foo1 | foo;
    foo = (fooEnum) bar;

工作,输出应该是3

1 个答案:

答案 0 :(得分:1)

以下一行:

foo |= (fooEnum) bar;

相当于:

foo = foo | (fooEnum) bar;

按位OR运算符使其参数被视为int类型(通过整数提升规则)。因此,赋值的右侧将计算为int类型的值。这不能直接分配给fooEnum实例foo,因此编译器会标记错误。