输入双关语转换

可以使用 reinterpret_cast 将对象类型的指针(resp。引用)转换为指向任何其他对象类型的指针(resp。reference)。这不会调用任何构造函数或转换函数。

int x = 42;
char* p = static_cast<char*>(&x);      // error: static_cast cannot perform this conversion
char* p = reinterpret_cast<char*>(&x); // OK
*p = 'z';                              // maybe this modifies x (see below)

Version >= C++ 11

reinterpret_cast 的结果表示与操作数相同的地址,前提是地址适当地与目标类型对齐。否则,结果未指定。

int x = 42;
char& r = reinterpret_cast<char&>(x);
const void* px = &x;
const void* pr = &r;
assert(px == pr); // should never fire

Version < C++ 11

reinterpret_cast 的结果是未指定的,只是指针(resp。引用)将在从源类型到目标类型的往返行程中存活并返回,只要目标类型的对齐要求不比源类型的更严格。

int x = 123;
unsigned int& r1 = reinterpret_cast<unsigned int&>(x);
int& r2 = reinterpret_cast<int&>(r1);
r2 = 456; // sets x to 456

在大多数实现中,reinterpret_cast 不会更改地址,但是这个要求在 C++ 11 之前没有标准化。

reinterpret_cast 还可用于将一个指针转换为数据成员类型转换为另一个指针,或指向成员函数类型转换为另一个指针。

使用 reinterpret_cast 被认为是危险的,因为当源和目标类型不相关时,通过使用 reinterpret_cast 获得的指针或引用进行读取或写入可能会触发未定义的行为。