Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我可以将匿名枚举设置为C中的另一个枚举,而不是C++;?_C++_C_Compiler Construction - Fatal编程技术网

C++ 为什么我可以将匿名枚举设置为C中的另一个枚举,而不是C++;?

C++ 为什么我可以将匿名枚举设置为C中的另一个枚举,而不是C++;?,c++,c,compiler-construction,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 test.c:6:错误:无法将分配中的“main()::”转换为“main():” 有人能给我解释一下为什么会这样吗?我

我有以下代码片段:

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
test.c:6:错误:无法将分配中的“main()::”转换为“main():”

有人能给我解释一下为什么会这样吗?我更喜欢回答编译器为什么会这样做,而不仅仅是“你不能那样做”

从一个枚举类型转换到另一个枚举类型需要一个整数类型(可能是源代码的基础类型,不确定)

从EnUM到整数类型的隐式转换在C和C++中都是允许的。在C中允许从整数类型到枚举的隐式转换,但不在C++中使用。 基本上,C++是更安全的类型。它试图阻止你这样做:

enum {zero, one, two} x;

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

如果您想在C++中执行这个枚举枚举转换,可以使用Type/DeCuff/Boost类型或等效。在GCC中:

int main() {
    enum {zero, one, two} x;
    enum {zero1, one1, two1} y = two1;
    typedef typeof(x) xtype;
    x = static_cast<typeof(x)>(y);
}
intmain(){
枚举{0,1,2}x;
枚举{zero1,one1,two1}y=two1;
typedef typeof(x)xtype;
x=静态铸件(y);
}

不过,这样做通常没有意义。在大多数情况下,枚举(尤其是匿名枚举)是“枚举类型”。它们恰巧是C和C++标准作为“戴着有趣帽子的整数”而实现的,但这并不意味着<代码>红色<代码>等于“代码”> HAMP<代码>,因为它们分别出现在两个不同的枚举(颜色和工具)中。code>static_cast表明所涉及的两种类型之间存在关系。任何两个枚举类型都是“相关”的,因为它们都有一个基础整数类型,并且它们是相关的,所以这里的“关系”实际上并没有说太多。如果你写了这个代码,你会得到一个非常糟糕的类型安全版本。

< P>我猜这是因为C++中的更严格的类型。 C
x=5也可以编译。在C++中,因为没有定义类型转换。这就是为什么x=y不能编译的原因


您可以查看,它提供了比编译器更详细的错误描述。

编译器不知道如何将一种枚举数据类型隐式转换为另一种

尝试以下方法

enum typeX { one } x;
enum typeY { two } y;
x = (typeX) y;

我主要关心的是匿名枚举,而不是命名的。@samoz-无论枚举是否命名,答案都是一样的。您已经创建了两种新的数据类型,但编译器不知道如何隐式地将它们转换为另一种,因此出现了错误。您从中得到了很多要点,那么为什么不检查并提及Boost TYPEOF(或其他方法)能够构造将任何外来类型分配给匿名枚举变量所需的强制转换表达式…(编辑-我没有安装Boost,scandalous!,或者我会尝试。)足够公平。不知道为什么要这样做,但是,如果你想把一个枚举当作一个整数,不要使用匿名枚举:-)我一直在使用旧版本的boost,没有typeof,但我在g++上尝试过,它似乎很乐意使用匿名类型。我还没有检查
decltype
是否也会这样做。我所见过的唯一需要它的原因是序列化。正在序列化为整数类型并首先在整数类型中反序列化,然后在枚举中反序列化的枚举。。。我总是觉得这很尴尬,特别是因为作者使用了无符号整数类型……您可以创建一个包含转换函数的类。然后可以像
x=make_caster(y)那样使用对象生成器,如
template caster make_caster(EnumType){return caster(e);}
(顺便说一句,C++03不支持未命名类型作为模板参数,因此您仍然需要编译器帮助)。当有人告诉我他们使用enum时,我会记住这个示例,因为它可以防止编写错误的代码。基本上,C允许您编写代码。如果你写了错误的代码,你就有了错误的代码。使用隐式强制转换是不好的代码,(某些)C显然允许您这样做,即使这种情况很糟糕。进一步的问题:这是入侵编译器的东西,以“更充分地支持”错误使用未命名枚举来创建常量吗?可能是这样。