const_cast 僅能移除指針/引用的 const 資格,若原對象真正是 const 定義,修改其行為未定義(UB)。
const int a = 789; int &b = const_cast<int&>(a); int *c = const_cast<int*>(&a); cout << a << ' ' << b << ' ' << *c; // 輸出: 789 789 789 b = 456; cout << a << ' ' << b << ' ' << *c; // 輸出: 789 456 456 ← a 未變!
原因:編譯器將 a 視為編譯期常量,直接內聯替換,內存中的 a 可能位於只讀段,寫入導致 UB。
const double arr[3] = {1.2, 3.3, 4.5};
double *p = const_cast<double*>(arr);
p[0] = 9.9; // 可能成功修改內存
cout << arr[0]; // 但 arr[0] 仍可能輸出 1.2(編譯器優化)
雖然數組退化為指針,允許通過 const_cast 修改內存,**但標準規定修改原為 const 的對象是 UB**,結果不可移植。
const 的對象。// 正確:API 要求非 const,但我們知道不會修改
void legacy_api(char *str); // 不修改 str
void safe_call(const string &s) {
legacy_api(const_cast<char*>(s.c_str())); // 安全,因 legacy_api 不寫入
}