欢迎使用 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 angels
IMO 基本上排除了通过实验学习 C++。
选择一本好书(或几本)并从头到尾阅读它(它们)……不幸的是,没有其他方法。我的建议是:“C++ 编程语言”(Stroustrup)、“Effective C++”和“更有效的 C++”(Meyers)、“C++ 常见问题解答”(Cline/Lomow/Girou)。
C++ 是一个非常强大和不错的武器,但如果从错误的角度来处理它,它可能会成为你最糟糕的噩梦。假设您可以仅使用逻辑来理解它是一种错误的方法(并不是因为您的逻辑很弱,而是因为 C++ 不仅仅是逻辑)。