输入双关语转换
可以使用 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
获得的指针或引用进行读取或写入可能会触发未定义的行为。