C 風格強制轉型 (Type)expr 混淆了多種語意,且易掩蓋錯誤。C++ 引入四個具備明確語意、可被搜尋、編譯器可檢查的模板式轉型運算子:
reinterpret_cast — 位元重新解釋(編譯期)用途:指標間互轉、指標↔整數轉換。不改變位元模式,僅重新解釋型別。
double d = 9.3;
double* pd = &d;
int* pi = reinterpret_cast<int*>(pd); // 指標互轉
uintptr_t addr = reinterpret_cast<uintptr_t>(pd); // 指標轉整數
限制:不可用於非指標型別(如 int → double)、不可移除 const/volatile、不可將 const T* 轉 void*(需先 const_cast)。
const_cast — 移除/添加 cv 資格(編譯期)唯一合法用途:移除 const/volatile 傳遞給不支援 const 的舊式 API(且確知物件原本非 const)。
const int* pci = &x;
int* pi = const_cast<int*>(pci); // 移除 const
const int* pci2 = const_cast<const int*>(pi); // 添加 const
限制:僅限指標/參考型別;不可用於值型別(const_cast<int>(x) 編譯失敗)。修改原本為 const 的物件 → 未定義行為。
static_cast — 靜態型別轉換(編譯期)適用場景:
double d = static_cast<double>(i);Base* pb = static_cast<Base*>(pd);Derived* pd = static_cast<Derived*>(pb); — 無執行期檢查,錯誤導致 UB。void* 取回原型別:T* p = static_cast<T*>(vp);enum class 雙向轉換。不可用於:非相關類別指標互轉、移除 const、指標↔整數(需 reinterpret_cast)。
dynamic_cast — 執行期多型安全轉型前提:來源型別為多型類別(至少有一個虛函數)。
nullptr。std::bad_cast。Shape* sp = new Circle;
Circle* cp = dynamic_cast<Circle*>(sp); // 成功
Triangle* tp = dynamic_cast<Triangle*>(sp); // 失敗,返回 nullptr
機制:執行期檢查 RTTI(vptr 指向的型別資訊),支援橫向轉型(兄弟類別間)與虛擬繼承下的指標調整。
效能:比 static_cast 慢(需走型別資訊鏈),熱點路徑避免使用;若確定型別安全,改用 static_cast。
static_castconst/volatile → const_castreinterpret_castdynamic_caststd::variant/any(C++17)。static_cast 替代 C 風格轉型,編譯器會攔截更多錯誤。dynamic_cast 失敗通常暗示設計缺陷(違反 LSP),優先重構。