在C++中通过整数将枚举类型转换为另一个枚举类型

3

将枚举类型通过整数转换转换为其他枚举类型,像下面所示的这样,是有效的吗?在x64的gcc中似乎没有问题,但是否也可以在其他编译器和平台上实现相同的效果呢?

a等于A_third且在enum_B中没有相应的值时,会发生什么?

enum enum_A {
    A_first = 0,
    A_second,
    A_third
};

enum enum_B {
    B_first = 0,
    B_second
};

enum_A a = A_first;
enum_B b;

b = enum_B(int(a)); 

2
当a等于A_third并且在enum_B中没有相应的值时会发生什么?你希望发生什么?你肯定意识到你所尝试的是根本上错误的。你在这里想要实现什么? - David Heffernan
@JoachimPileborg,你确定这是未定义行为吗?我们不是在谈论C++11中更强的枚举类型。 - Bathsheba
我的理解是,如果它不会溢出枚举的隐含整数类型,那么你会得到一个未标记的枚举值;这是明确定义的。 - Bathsheba
@Bathsheba 你可能是对的,而且我现在没有规范可供参考,所以我会撤回我的评论。 - Some programmer dude
@DavidHeffernan:是的,我意识到这非常错误。我只是好奇在执行期间应该发生什么:程序会崩溃并显示错误吗?还是会默默失败并继续使用不可预测的值... - antou
1个回答

3

在进行此操作时,您需要小心,因为存在一些边缘情况:

根据C++11标准(§7.2,6):

对于底层类型未固定的枚举类型,其底层类型是可以表示枚举中定义的所有枚举值的整数类型。如果没有整数类型可以表示所有枚举值,则该枚举类型是非法的。使用作为底层类型的整数类型是实现定义的,但是底层类型不得大于 int,除非枚举值无法适合 int 或 unsigned int。

这意味着一个 enum 可能是比一个 int 更大的类型,所以从 enumint 的转换可能会失败,并导致未定义的结果。

在上述条件下,确实可以将 int 转换为 enum,从而产生一个 enum 没有明确指定的枚举值。非正式地说,您可以把一个 enum 看作是一个带有标签的具有一些值的整数类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接