C++ 提供四種具名轉型運算子,分別針對不同語義場景,比 C 風格的 (Type)expr 更安全、意圖更明確。本文系統梳理它們的適用場景、限制與底層行為。
void* 與具體指標互轉、隱式轉換的顯式化。/GR / -frtti)。nullptrstd::bad_cast(需 <typeinfo>)public 繼承會導致轉換失敗/拋出異常。const 或 volatile 資格。const,透過移除後的引用修改它 → UB。const 的舊式 API、實作「邏輯常態」的快取機制。(Type)expr / Type(expr)const_cast → static_cast → static_cast + const_cast → reinterpret_cast → reinterpret_cast + const_cast。reinterpret_cast、難以搜尋審查。Type(expr):某些編譯器下確保呼叫建構函式,較 (Type)expr 稍佳,但仍不建議使用。| 場景 | 推薦 Cast | 備註 |
|---|---|---|
| 基本型別/非多態層級轉換 | static_cast | 明確、高效 |
| 多態基類 → 派生類 | dynamic_cast | 需 RTTI,檢查失敗處理 |
| 移除 const(極少數) | const_cast | 確保物件非常量 |
| 指標 ⇔ 整數/底層 Hack | reinterpret_cast | 隔離在平台相關層 |
| 其他 | 避免 C 風格 | 用具名 Cast 表達意圖 |