const_cast 演算子 は、const または volatile
修飾子を、型へ追加または型から除去するために使用されます。
構文 - const_cast >>-const_cast--<--Type-->--(--expression--)--------------------><
Type と expression の型は、 それらの const および volatile 修飾子に関してのみ異なります。 それらのキャストは、コンパイル時に解決されます。 単一の const_cast 式で、 任意の数の const または volatile 修飾子を追加または除去できます。
const_cast 式の結果は、Type が参照型でない限り、右辺値です。 この場合、結果は左辺値です。
型は const_cast 内では定義できません。
以下は、const_cast 演算子の使用法を示したものです。
#include <iostream> using namespace std; void f(int* p) { cout << *p << endl; } int main(void) { const int a = 10; const int* b = &a; // Function f() expects int*, not const int* // f(b); int* c = const_cast<int>(b); f(c); // Lvalue is const // *b = 20; // Undefined behavior // *c = 30; int a1 = 40; const int* b1 = &a1; int* c1 = const_cast<int>(b1); // Integer a1, the object referred to by c1, has // not been declared const *c1 = 50; return 0; }
コンパイラーは、関数呼び出し f(b) を許可しません。 関数 f() は、const int ではなく int を指すポインターを期待します。 ステートメント int* c = const_cast<int>(b) は、a の const 修飾なしに a を指すポインター c を戻します。 const_cast を使用してオブジェクトの const 修飾を除去するこのプロセスは、 casting away constness と呼ばれています。 したがって、コンパイラーは、関数呼び出し f(c) を行うことができます。
コンパイラーは、代入 *b = 20 を許可しません。 なぜなら、b は、型 const int のオブジェクトを指すからです。 コンパイラーは *c = 30 を許可します。しかし、このステートメントの振る舞いは未定義です。 const として明示的に宣言されているオブジェクトの constness をキャストし、 それを変更しようとする場合、結果は未定義です。
しかし、const として明示的に宣言されていないオブジェクトの constness をキャストする場合、 それを安全に変更することができます。 上記の例では、b1 が参照しているオブジェクトは、const と宣言されていません。 しかし、このオブジェクトを b1 によって変更することはできません。 b1 の constness をキャストし、それが参照している値を変更できます。
関連参照