名前空間
変種
操作

const_cast 変換

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

異なる 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 は
                                              // 関数ポインタには使えません。
}

出力:

i = 4
type::i = 4

[編集] 関連項目