【问题标题】:conversion error with enum in bit OR位或枚举中的转换错误
【发布时间】:2015-04-12 01:13:55
【问题描述】:

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

【问题讨论】:

    标签: c++11 gcc enums bit


    【解决方案1】:

    下面一行:

    foo |= (fooEnum) bar;
    

    相当于:

    foo = foo | (fooEnum) bar;
    

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

    【讨论】:

    • 是的,将其更改为 foo = (fooEnum) (foo | (fooEnum) bar); 有效。
    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多