表达式 reinterpret_cast<T>(v) 用于更改对表达式 v 值的解释。该表达式可用于在指针和整型之间,在不相关的指针类型之间,在指向成员的指针类型之间,和在指向函数的指针类型之间转换类型。
使用 reinterpret_cast 运算符可能会得到未定义的结果或实现相关结果。以下几点描述了唯一确定的行为:
指向数据对象或函数的指针(但不是指向成员的指针)可以转换为足够包含该指针的任何整型。(long 类型总是足以包含 C++ 编译器支持的体系结构上的指针值。)转换回原始类型时,指针值将与原始指针值相比较。
指向(非成员)函数的指针可以转换为指向不同(非成员)函数类型的指针。如果转换回原始类型,指针值将与原始指针相比较。
假设新类型的对齐要求没有原始类型严格,则指向对象的指针可以转换为指向不同对象类型的指针。转换回原始类型时,指针值将与原始指针值相比较。
如果可以使用重新解释强制类型转换将“指向 T1 的指针”类型的表达式转换为“指向 T2 的指针”类型的表达式,则 T1 类型左值可以转换为“对 T2 的引用”类型。
如果 T1 和 T2 都是函数类型或都是对象类型,则“指向 T1 类型的 X 的成员的指针”类型右值可以显式转换为“指向 T2 类型的 Y 的成员的指针”类型右值。
在所有允许的情况下,空指针类型转换为不同的空指针类型后仍然是空指针。
reinterpret_cast 运算符不能用来删除 const,可使用 const_cast 来实现。
reinterpret_cast 运算符不能用来在指向同一类分层结构中不同类的指针之间进行转换,可使用静态或动态强制类型转换来实现。(reinterpret_cast 不执行所需的调整。)这一点在以下示例中描述:
class A {int a; public: A();}; class B: public A {int b, c;}; void use_of_reinterpret_cast() { A a1; long l = reinterpret_cast<long>(&a1); A* ap = reinterpret_cast<A*>(l); // safe B* bp = reinterpret_cast<B*>(&a1); // unsafe const A a2; ap = reinterpret_cast<A*>(&a2); // error, const removed } |