const_cast
轉換
來自 cppreference.com
轉換帶有不同 cv 限定符的型別。
目錄 |
[編輯] 語法
const_cast< 目標型別 >( 表示式 ) |
|||||||||
返回 目標型別 的值。
[編輯] 解釋
僅允許使用 const_cast 進行以下轉換
1) 對於兩個相似的物件指標或資料成員指標型別
T1
和 T2
,如果 T1
和 T2
僅在 cv 限定符上有所不同(形式上,如果考慮兩種型別的限定符分解,所有 i 的 P1_i
都與 P2_i
相同),則型別為 T1
的純右值可以轉換為 T2
。- 如果 表示式 是空指標值,則結果也是空指標值。
- 如果 表示式 是空成員指標值,則結果也是空成員指標值。
- 如果 表示式 指向一個物件,則結果指向同一個物件。
- 如果 表示式 指向一個物件之後,則結果指向同一個物件之後。
- 如果 表示式 指向一個數據成員,則結果指向同一個資料成員。
即使 表示式 是純右值,也不會執行臨時實質化。 |
(C++17 起) |
2) 對於兩個物件型別
T1
和 T2
,如果指向 T1
的指標可以使用 const_cast<T2*> 顯式轉換為“指向 T2
的指標”型別,則也可以進行以下轉換- 型別為
T1
的左值可以使用 const_cast<T2&> 顯式轉換為型別為T2
的左值。
|
(C++11 起) |
結果引用指向原始物件。 |
(C++17 前) |
如果 表示式 是泛左值,則結果引用指向原始物件。否則,結果引用指向已實質化的臨時物件。 |
(C++17 起) |
與所有轉換表示式一樣,結果是
- 如果 目標型別 是左值引用型別或函式型別的右值引用(C++11 起),則為左值;
|
(C++11 起) |
- 否則為純右值。
[編輯] 移除 const 屬性
對於兩個不同型別 T1
和 T2
,如果存在 T2
形式為“cv2_0 P2_0 cv2_1 P2_1 ... cv2_n−1 P2_n−1 cv2_n U2”的限定符分解,並且沒有限定符轉換將 T1
轉換為“cv2_0 P1_0 cv2_1 P1_1 ... cv2_n−1 P1_n−1 cv2_n U1”(相同的 cv 元件,不同的 P 元件和 U 元件),則從 T1
到 T2
的轉換會“移除 const 屬性”。
如果從型別 T1*
的純右值到型別 T2*
的轉換會移除 const 屬性,則從型別 T1
的表示式到 T2
的引用的轉換也會移除 const 屬性。
只有 const_cast 可用於移除 const 屬性。
“移除 const 屬性”也意味著“移除 volatile 屬性”,因為限定符轉換也不能移除 volatile 屬性。
[編輯] 注意
函式指標和成員函式指標不受 const_cast 限制。
const_cast 使得可以形成實際引用const 物件的非 const 型別的引用或指標,或者實際引用volatile 物件的非 volatile 型別的引用或指標。透過非 const 訪問路徑修改 const 物件以及透過非 volatile 泛左值引用 volatile 物件會導致未定義行為。
[編輯] 關鍵詞
[編輯] 示例
執行此程式碼
#include <iostream> struct type { int i; type(): i(3) {} void f(int v) const { // this->i = v; // compile error: this is a pointer to const const_cast<type*>(this)->i = v; // OK as long as the type object isn't const } }; int main() { int i = 3; // i is not declared const const int& rci = i; const_cast<int&>(rci) = 4; // OK: modifies i std::cout << "i = " << i << '\n'; type t; // if this was const type t, then t.f(4) would be undefined behavior t.f(4); std::cout << "type::i = " << t.i << '\n'; const int j = 3; // j is declared const [[maybe_unused]] int* pj = const_cast<int*>(&j); // *pj = 4; // undefined behavior [[maybe_unused]] void (type::* pmf)(int) const = &type::f; // pointer to member function // const_cast<void(type::*)(int)>(pmf); // compile error: const_cast does // not work on function pointers }
輸出
i = 4 type::i = 4
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
CWG 1965 | C++11 | const_cast 無法將右值引用繫結到陣列純右值 | 允許繫結此類引用 |
CWG 2879 | C++17 | 指標純右值運算元被實質化 | 它們未被實質化 |
[編輯] 參考
- C++23 標準 (ISO/IEC 14882:2024)
- 7.6.1.11 Const 轉換 [expr.const.cast]
- C++20 標準 (ISO/IEC 14882:2020)
- 7.6.1.10 Const 轉換 [expr.const.cast]
- C++17 標準 (ISO/IEC 14882:2017)
- 8.2.11 Const 轉換 [expr.const.cast]
- C++14 標準 (ISO/IEC 14882:2014)
- 5.2.11 Const 轉換 [expr.const.cast]
- C++11 標準 (ISO/IEC 14882:2011)
- 5.2.11 Const 轉換 [expr.const.cast]
- C++98 標準 (ISO/IEC 14882:1998)
- 5.2.11 Const 轉換 [expr.const.cast]
- C++03 標準 (ISO/IEC 14882:2003)
- 5.2.11 Const 轉換 [expr.const.cast]