12

为什么我不能对这样的演员使用 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);
}
4

2 回答 2

22

我认为这reinterpret_cast可以用于所有类型的强制转换,因为它强制任何类型强制转换为另一种类型,并具有这种转换的所有副作用。

这是一个普遍的误解。可以执行的转换reinterpret_cast在标准的 5.2.10 中明确列出。int-to-enumenum-to-int转换不在列表中:

  • 指向整数类型的指针,只要整数足够大以容纳它
  • nullptr_t为整数
  • 整型或enum指向指针
  • 指向另一个不同类型的函数指针的函数指针
  • 指向另一个不同类型的对象指针的对象指针
  • nullptr_t到其他指针类型
  • 在和都是对象或函数的情况下,T1指向不同成员的指针的指针T2T1T2

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

还值得注意的是,reinterpret_cast可能会对位产生影响:

5.2.10.3

[注意:由 reinterpret_cast 执行的映射可能会或可能不会产生与原始值不同的表示。——尾注]

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

于 2012-09-01T14:34:21.037 回答
4

因为常规枚举基础类型是int,所以没有什么需要重新解释的。对于这种情况,静态转换是正确的转换。

于 2012-09-01T14:33:53.377 回答