为什么我不能使用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); }
解决方法
I think that
reinterpret_cast
can be use for all types of casts,because it’s force any type casts to another type with all side-effects of this conversion.
这是一个常见的误解.可以使用reinterpret_cast执行的转换在标准的5.2.10中明确列出. int-to-enum和enum-to-int转换不在列表中:
>整数类型的指针,只要整数大到足以容纳它
> nullptr_t为整数
>整数类型或枚举到指针
>函数指向不同类型的另一个函数指针
>指向不同类型的另一个对象指针的对象指针
> nullptr_t到其他指针类型
> T1和T2都是对象或函数的情况下,T1的指向成员到T2的不同对象
reinterpret_cast通常用于告诉编译器:嘿,我知道你认为这个内存区域是T,但我想让你把它解释为一个U(其中T和U是不相关的类型).
还值得注意的是,reinterpret_cast可以对位有影响:
5.2.10.3
[ Note: The mapping performed by reinterpret_cast might,or might not,produce a representation dif-
ferent from the original value. — end note ]
C风格的演员总是奏效,因为它包含了static_cast的尝试.