可以使用reinterpret_cast将指向对象类型的指针(重新引用)转换为指向任何其他对象类型的指针(重新引用)。 这不会调用任何构造函数或转换函数。
int x = 42; char* p = static_cast<char*>(&x); // 错误:static_cast无法执行此转换 char* p = reinterpret_cast<char*>(&x); // OK *p = 'z'; // 也许这会修改x(请参见下文)
只要该地址针对目标类型进行了适当对齐,则reinterpret_cast的结果表示与操作数相同的地址。 否则,结果不确定。
int x = 42; char& r = reinterpret_cast<char&>(x); const void* px = &x; const void* pr = &r; assert(px == pr); // 永不触发
reinterpret_cast的结果是未指定的,除了指针(例如。只要目标类型的对齐要求不比源类型更严格,引用)将在从源类型到目标类型并返回的往返过程中存在。
int x = 123; unsigned int& r1 = reinterpret_cast<unsigned int&>(x); int& r2 = reinterpret_cast<int&>(r1); r2 = 456; // 将x设置为456
在大多数实现中,reinterpret_cast不更改地址,但是直到C ++ 11才将该要求标准化。
reinterpret_cast 也可以用于将一种从指针到数据成员的类型转换为另一种,或从一种指针到成员功能的类型转换为另一种。
使用reinterpret_cast之所以被认为是危险的,是因为reinterpret_cast当源类型和目标类型不相关时,通过使用该方法获得的指针或引用进行读或写操作可能会触发未定义的行为。