为什么我不能使用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);
}
答案 0 :(得分:20)
我认为
reinterpret_cast
可以用于所有类型的强制转换,因为强制任何类型强制转换为具有此转换的所有副作用的其他类型。
这是一种常见的误解。可以使用reinterpret_cast
执行的转换在标准的5.2.10中明确列出。 int
- 至 - enum
和enum
- 至 - int
转化不在列表中:
nullptr_t
到整数enum
指针nullptr_t
到其他指针类型T1
和T2
都是对象或函数的情况下,T1
成员指向T2
成员的不同指针 reinterpret_cast
通常用于告诉编译器:嘿,我知道您认为这个内存区域是T
,但我希望您将其解释为U
(其中T
和U
是不相关的类型)。
值得注意的是reinterpret_cast
会对位产生影响:
<强> 5.2.10.3 强>
[注意:reinterpret_cast执行的映射可能会或可能不会产生表示差异 不符合原始价值。 - 结束说明]
C风格的演员总是有效,因为它的尝试中包含了static_cast
。
答案 1 :(得分:4)
由于常规枚举基础类型为int
,因此reinterpret没有任何内容。对于这种情况,静态演员是正确的转换。