const_cast 演算子 (C++ のみ)
const_cast 演算子 は、const または volatile 修飾子を、型へ追加または型から除去するために使用されます。
右不等号括弧の機能により、2 つの連続する > トークンの代わりに >> トークンを使用して、template_id を const_cast 演算子の Type として指定することができます。詳しくは、クラス・テンプレート (C++ のみ) を参照してください。
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 をキャストし、それが参照している値を変更できます。