7

使用以下 C++ 定义:

enum EnumA {
    EA_Element = 1
};

enum EnumB {
    EB_Element = 10
};

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

EnumA variable;
variable = EB_Element; // won't compile

但以下代码确实编译:

EnumA variable = EA_Element;
if( variable == EB_Element ) { //will compile
}

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

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

4

4 回答 4

6

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

于 2011-07-06T06:53:53.397 回答
4

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

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

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

于 2011-07-06T06:52:23.053 回答
2

并不是说不可能,只是当它们都是整数时,编译器认为它们是两种不同的数据类型。所以一个简单的类型转换就可以解决这个问题。

EnumA variable;
variable = (EnumA)EB_Element;
于 2011-07-06T06:53:33.557 回答
1

欢迎使用 C++!

对于更有趣的事情,试试这个:

#include <string>

int main(int argc, const char *argv[])
{
    std::string s;
    s = 3.141592654;
    return 0;
}

为什么要编译?原因是语言规则是这样说的。

在这个奇怪的情况下,关于为什么这个例子编译的“官方”解释是它似乎是正确的std::string::operator+=(char)(从实用的角度来看,IMO ok 和合乎逻辑)并且“因此”也从 char 分配(IMO 不合逻辑的不合理)。但是 chars 是整数(不合逻辑,但 C 继承),双精度可以隐式转换为整数(不合逻辑,但 C 继承)。因此,在 C++ 中,将双精度分配给字符串是不合逻辑的(但合法)。

如果您不知道,请不要难过,我展示的大多数 C++ 程序员都对为什么这样的废话编译并考虑其他语义或编译器错误感到困惑。

在您的问题的情况下,原因是枚举在某些情况下就像整数(可能是因为用例的传统),但在其他情况下不像整数。这很荒谬,但这是标准要求的。

如果您对这种明显缺乏逻辑感到不舒服,请记住 C++ 主要是悠久历史甚至委员会(!)的结果,因此逻辑与它没有太大关系。这也意味着人们不能使用逻辑来避免学习 C++:无论你多么聪明,你都无法猜测历史事故和委员会的政治决定。

高 C++ 复杂性、许多地方缺乏逻辑以及存在undefined behavior daemons而不是runtime error angelsIMO 基本上排除了通过实验学习 C++。

选择一本好书(或几本)并从头到尾阅读它(它们)……不幸的是,没有其他方法。我的建议是:“C++ 编程语言”(Stroustrup)、“Effective C++”和“更有效的 C++”(Meyers)、“C++ 常见问题解答”(Cline/Lomow/Girou)。

C++ 是一个非常强大和不错的武器,但如果从错误的角度来处理它,它可能会成为你最糟糕的噩梦。假设您可以仅使用逻辑来理解它是一种错误的方法(并不是因为您的逻辑很弱,而是因为 C++ 不仅仅是逻辑)。

于 2011-07-06T07:09:55.617 回答