◐ Shell
clean mode source ↗

const_cast 変換 - cppreference.com

提供: cppreference.com

異なる cv 修飾を持つ型の間で変換します。

構文

const_cast < new_type > ( expression )

new_type 型の値を返します。

説明

以下の変換のみが const_cast を用いて行うことができます。 特に、 cv 修飾を除去するために使用できるキャストは const_cast だけです。

1) 同じ型への2つのポインタ (多段でも構いません) は、その各段の cv 修飾子に関わらず、お互いに変換できます。

2) 任意の型 T の lvalue は、より多くまたは少なく cv 修飾された同じ型 T への左辺値参照または右辺値参照に変換できます。 同様に、右辺値は、より多くまたは少なく cv 修飾された右辺値参照に変換できます。 参照の const_cast の結果は、元のオブジェクト (C++17未満)expression が glvalue の場合は元のオブジェクト、そうでなければ具体化された一時オブジェクト (C++17以上)を参照します。

3) データメンバへのポインタ (多段でも構いません) および境界が既知な配列および不明な配列へのポインタ (多段でも構いません) (cv 修飾された要素への配列はそれ自身 cv 修飾されているとみなされます) (C++17以上) にも同じルールが適用されます。

4) ヌルポインタ値は new_type のヌルポインタ値に変換できます。

すべてのキャスト式と同様に、

  • new_type が左辺値参照型または関数への右辺値参照型の場合、結果は lvalue です。
  • new_type がオブジェクト型への右辺値参照型の場合、結果は xvalue です。
  • そうでなければ、結果は prvalue です。

ノート

関数へのポインタおよびメンバ関数へのポインタは const_cast の対象ではありません。

const_cast は、実際には const オブジェクトを参照している非 const 型への参照またはポインタや、実際には volatile オブジェクトを参照している非 volatile 型への参照またはポインタを、形成することを可能とします。 非 const なアクセス経路を通して const オブジェクトを変更することや、非 volatile な glvalue を通して volatile オブジェクトを参照することは、未定義動作です。

キーワード

const_cast

#include <iostream>

struct type {
    int i;

    type(): i(3) {}

    void f(int v) const {
        // this->i = v;                 // コンパイルエラー、 this は const へのポインタです。
        const_cast<type*>(this)->i = v; // type オブジェクトが const でない限りは OK。
    }
};

int main() 
{
    int i = 3;                 // i は const 宣言されていません。
    const int& rci = i; 
    const_cast<int&>(rci) = 4; // OK、 i を変更します。
    std::cout << "i = " << i << '\n';

    type t; // もしこれが const type t; だったならば、 t.f(4) は未定義動作です。
    t.f(4);
    std::cout << "type::i = " << t.i << '\n';

    const int j = 3; // j は const 宣言されています。
    int* pj = const_cast<int*>(&j);
    // *pj = 4;      // 未定義動作。

    void (type::* pmf)(int) const = &type::f; // メンバ関数へのポインタ。
    // const_cast<void(type::*)(int)>(pmf);   // コンパイルエラー、 const_cast は
                                              // 関数ポインタには使えません。
}

出力:

関連項目