位或中的枚举转换错误

conversion error with enum in bit OR

我有这段代码无法用 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 应该的。

下面一行:

foo |= (fooEnum) bar;

相当于:

foo = foo | (fooEnum) bar;

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