位或中的枚举转换错误
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
,因此编译器会标记错误。
我有这段代码无法用 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
,因此编译器会标记错误。