sam*_*moz 26 c c++ compiler-construction
我有以下代码片段:
enum { one } x;
enum { two } y;
x = y;
Run Code Online (Sandbox Code Playgroud)
这将在C中编译,但在C++中,我收到以下错误:
test.c:6: error: cannot convert ‘main()::<anonymous enum>’ to ‘main()::<anonymous enum>’ in assignment
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么会这样吗?我更倾向于回答一些具体细节,说明编译器为什么会这样做,而不仅仅是"你不能那样做"
Ste*_*sop 34
从一个枚举类型转换为另一个枚举类型通过整数类型(可能是源的基础类型,不确定).
在C和C++中都允许从枚举到整数类型的隐式转换.在C中允许从整数类型到枚举的隐式转换,但在C++中则不允许.
基本上,C++更安全.它试图阻止你这样做:
enum {zero, one, two} x;
x = 143; // assigns a value outside the range of the enum
Run Code Online (Sandbox Code Playgroud)
如果要在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);
}
Run Code Online (Sandbox Code Playgroud)
但是,这样做通常没有意义.对于大多数目的,枚举(尤其是匿名的)是"枚举类型".它们碰巧被C和C++标准"实现"为戴着滑稽帽子的整数,但这并不意味着red
"等于" hammer
只是因为它们各自首先出现在两个不同的枚举中(分别是颜色和工具).static_cast
表明所涉及的两种类型之间存在关系.任何两个枚举类型都是"相关的",因为它们都有一个基础整数类型,而且它们是相关的,所以"关系"实际上并没有多说.如果你编写这段代码,你会得到类型安全性很差的版本.