輸入雙關語轉換

可以使用 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 獲得的指標或引用進行讀取或寫入可能會觸發未定義的行為。