const 去除、層次轉換、重新解釋位模式混不吝啃。(Type)expr 與普通括號表達式混淆,工具難掃描。| 操作符 | 用途 | 限制 |
|---|---|---|
static_cast<T>(expr) | 替代大多數 C 風格轉換(數值轉換、指針上下行、隱式轉換顯式化) | 不可去除 const/volatile;不可轉換不相關類型(如 struct* → int) |
const_cast<T>(expr) | 專門去除/添加 const 或 volatile | 僅允許修改 cv 資格,其他轉換編譯錯誤 |
dynamic_cast<T>(expr) | 多態層次中安全向下/橫向轉換(指針返回 nullptr,引用拋 bad_cast) | 要求類有虛函數(多態);不可去除 const;不可用於無繼承關係類型 |
reinterpret_cast<T>(expr) | 底層位模式重新解釋(指針↔整數、函數指針互轉) | 結果實現定義,極難移植;僅在極端情況使用 |
// static_cast
double d = static_cast<double>(i) / j;
// const_cast
update(const_cast<SpecialWidget*>(&csw)); // 去除 const
// dynamic_cast
update(dynamic_cast<SpecialWidget*>(pw)); // 安全向下轉換
// reinterpret_cast
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething); // 函數指針轉換
#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define dynamic_cast(TYPE,EXPR) ((TYPE)(EXPR)) // 無法模擬運行期檢查
const_cast 禁止層次轉換)。xxx_cast<> 關鍵字顯眼,人工/工具掃描容易。