枚举的reinterpret_cast错误

时间:2012-09-01 14:26:29

标签: c++ enums static-cast

为什么我不能使用reinterpret_cast运算符进行这样的转换?

enum Foo { bar, baz };

void foo(Foo)
{
}

int main()
{
   // foo(0); // error: invalid conversion from 'int' to 'Foo'
   // foo(reinterpret_cast<Foo>(0)); // error: invalid cast from type 'int' to type 'Foo'
   foo(static_cast<Foo>(0)); 
   foo((Foo)0);
}

2 个答案:

答案 0 :(得分:20)

  

我认为reinterpret_cast可以用于所有类型的强制转换,因为强制任何类型强制转换为具有此转换的所有副作用的其他类型。

这是一种常见的误解。可以使用reinterpret_cast执行的转换在标准的5.2.10中明确列出。 int - 至 - enumenum - 至 - int转化不在列表中:

  • 指向整数类型的指针,只要整数足够大以保持它
  • nullptr_t到整数
  • 整数类型或enum指针
  • 函数指向另一个不同类型的函数指针
  • 对象指向另一个不同类型的对象指针
  • nullptr_t到其他指针类型
  • T1T2都是对象或函数的情况下,T1成员指向T2成员的不同指针

reinterpret_cast通常用于告诉编译器:嘿,我知道您认为这个内存区域是T,但我希望您将其解释为U (其中TU是不相关的类型)。

值得注意的是reinterpret_cast会对位产生影响:

  

<强> 5.2.10.3

     

[注意:reinterpret_cast执行的映射可能会或可能不会产生表示差异   不符合原始价值。 - 结束说明]

C风格的演员总是有效,因为它的尝试中包含了static_cast

答案 1 :(得分:4)

由于常规枚举基础类型为int,因此reinterpret没有任何内容。对于这种情况,静态演员是正确的转换。