const_cast 変換
提供: 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 オブジェクトを参照することは、未定義動作です。
[編集] キーワード
[編集] 例
Run this code
#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