首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ const_cast 深度解析:能否真正修改 const 對象?

     編輯:關於C++

核心結論

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 對象被誤加的 const 資格**(如調用非 const 正確的舊式 API)。
  • 絕不嘗試修改真正定義為 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 不寫入
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved