枚举的reinterpret_cast错误

Fro*_*art 11 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);
}
Run Code Online (Sandbox Code Playgroud)

Tra*_*kel 21

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

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

  • 指向整数类型的指针,只要整数足够大以容纳它
  • nullptr_t 到整数
  • 积分类型或enum指针
  • 函数指针指向另一个不同类型的函数指针
  • 对象指向另一个不同类型的对象指针
  • nullptr_t 到其他指针类型
  • 的指针到构件T1到一个不同的指针到构件的T2在情况下都T1T2是对象或功能

reinterpret_cast通常用来告诉编译器:嘿,我知道你认为这个内存区域是一个T,但我希望你把它解释为U(在哪里TU不相关的类型).

值得注意的是,这reinterpret_cast可能对比特产生影响:

5.2.10.3

[注意:reinterpret_cast执行的映射可能会或可能不会产生与原始值不同的表示. - 结束说明]

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