为什么我不能分配错误的枚举元素,但可以与错误的枚举元素进行比较?

sha*_*oth 7 c++ enums types type-safety

使用以下C++定义:

enum EnumA {
    EA_Element = 1
};

enum EnumB {
    EB_Element = 10
};
Run Code Online (Sandbox Code Playgroud)

以下代码将无法编译,只有有意义:

EnumA variable;
variable = EB_Element; // won't compile
Run Code Online (Sandbox Code Playgroud)

但是下面的代码确实编译了:

EnumA variable = EA_Element;
if( variable == EB_Element ) { //will compile
}
Run Code Online (Sandbox Code Playgroud)

虽然它没有任何意义 - 比较不同的枚举,这样的代码可能是错误的.

为什么这些看似相同的情况在C++中的处理方式不同?

imb*_*aer 6

它将编译,因为"默认情况下枚举被转换为整数以进行算术运算." (参见:C++编程语言)


iam*_*ind 4

这个论点是正确的,因为我已经看到任何enum类型都可以与任何类型进行比较enum。这是因为为了比较的目的,enum变量和值应该转换为整型(例如int)。某些编译器确实会发出警告

这样的论点可以适用于unsigned int、等之间的比较,但可能出于相同的原因,它们都仅限于编译器警告intsize_t

然而,这个问题在 C++0x 中得到了解决enum class(它们没有改变现有的enum行为来保持兼容性)。