名稱空間
變體
操作

const_cast 轉換

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

轉換帶有不同 cv 限定符的型別。

目錄

[編輯] 語法

const_cast< 目標型別 >( 表示式 )

返回 目標型別 的值。

[編輯] 解釋

僅允許使用 const_cast 進行以下轉換

1) 對於兩個相似的物件指標或資料成員指標型別 T1T2,如果 T1T2 僅在 cv 限定符上有所不同(形式上,如果考慮兩種型別的限定符分解,所有 iP1_i 都與 P2_i 相同),則型別為 T1 的純右值可以轉換為 T2
  • 如果 表示式 是空指標值,則結果也是空指標值。
  • 如果 表示式 是空成員指標值,則結果也是空成員指標值。
  • 如果 表示式 指向一個物件,則結果指向同一個物件。
  • 如果 表示式 指向一個物件之後,則結果指向同一個物件之後。
  • 如果 表示式 指向一個數據成員,則結果指向同一個資料成員。

即使 表示式 是純右值,也不會執行臨時實質化

(C++17 起)
2) 對於兩個物件型別 T1T2,如果指向 T1 的指標可以使用 const_cast<T2*> 顯式轉換為“指向 T2 的指標”型別,則也可以進行以下轉換
  • 型別為 T1 的左值可以使用 const_cast<T2&> 顯式轉換為型別為 T2 的左值。
  • 型別為 T1 的泛左值可以使用 const_cast<T2&&> 顯式轉換為型別為 T2 的將亡值。
  • 如果 T1 是類或陣列型別,則型別為 T1 的純右值可以使用 const_cast<T2&&> 顯式轉換為型別為 T2 的將亡值。
(C++11 起)

結果引用指向原始物件。

(C++17 前)

如果 表示式 是泛左值,則結果引用指向原始物件。否則,結果引用指向已實質化的臨時物件

(C++17 起)

與所有轉換表示式一樣,結果是

  • 如果 目標型別 是左值引用型別或函式型別的右值引用(C++11 起),則為左值;
  • 如果 目標型別 是物件型別的右值引用,則為將亡值;
(C++11 起)
  • 否則為純右值。

[編輯] 移除 const 屬性

對於兩個不同型別 T1T2,如果存在 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 元件),則從 T1T2 的轉換會“移除 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 物件會導致未定義行為。

[編輯] 關鍵詞

const_cast

[編輯] 示例

#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]

[編輯] 參閱