c++ - 为什么我可以在 C 而不是 C++ 中设置一个匿名枚举等于另一个?

标签 c++ c compiler-construction

我有以下代码片段:

enum { one } x;
enum { two } y;
x = y;

这将在 C 中编译,但在 C++ 中,我收到以下错误:

test.c:6: error: cannot convert ‘main()::<anonymous enum>’ to ‘main()::<anonymous enum>’ in assignment

有人可以向我解释为什么会这样吗?我更喜欢一个关于编译器为什么会这样行为的具体答案,而不仅仅是“你不能那样做”

最佳答案

从一种枚举类型转换为另一种枚举类型需要通过整数类型(可能是源的基础类型,不确定)。

在 C 和 C++ 中都允许从枚举到整数类型的隐式转换。在 C 中允许从整数类型到枚举的隐式转换,但在 C++ 中则不允许。

基本上,C++ 的类型更安全。它试图阻止你这样做:

enum {zero, one, two} x;

x = 143; // assigns a value outside the range of the enum

如果你想在 C++ 中执行这种枚举-枚举转换,你可以使用 typeof/declspec/boost typeof 或等效的。在 GCC 中:

int main() {
    enum {zero, one, two} x;
    enum {zero1, one1, two1} y = two1;
    typedef typeof(x) xtype;
    x = static_cast<typeof(x)>(y);
}

不过,这样做通常没有意义。对于大多数目的,枚举(尤其是匿名的)是“枚举类型”。它们只是碰巧被 C 和 C++ 标准“实现”为戴着滑稽帽子的整数,但这并不意味着 red 只是“等于” hammer因为它们每个都首先出现在两个不同的枚举中(分别是颜色和工具)。 static_cast 表明所涉及的两种类型之间存在关系。任何两种枚举类型都是“相关的”,因为它们都具有底层整数类型,并且它们是相关的,所以那里的“关系”真的没有多说。如果您编写此代码,您将得到一个非常糟糕的类型安全版本。

关于c++ - 为什么我可以在 C 而不是 C++ 中设置一个匿名枚举等于另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2474091/

相关文章:

java - 在线Java编译器(多文件支持)

c++ - 在任何编程语言中通常如何处理异常?

c++ - Qt 动态属性值改变时的调用方法

c - 调用我在 Win7-x64 上创建的 Detoured 函数后应用程序崩溃

c - 我在调试 Visual Studio 2015 时遇到错误

compiler-construction - 自上而下的解析器希望在 'Code' 中有体面的案例示例左递归

C++。优化一个使用大量常量字符串的程序

c++ - 在 C++ 中索引整数指针

c++ - 无法从字符串流接收信息

c - If 语句在 ESP32 上未按预期工作