const_cast 演算子 (C++ のみ)

const_cast 演算子 は、const または volatile 修飾子を、型へ追加または型から除去するために使用されます。

構文図を読む構文図をスキップする
const_cast 演算子の構文 

>>-const_cast--<--Type-->--(--expression--)--------------------><

変更の始まり 右不等号括弧の機能により、2 つの連続する > トークンの代わりに >> トークンを使用して、template_idconst_cast 演算子の Type として指定することができます。詳しくは、クラス・テンプレート (C++ のみ) を参照してください。変更の終わり

Typeexpression の型は、 それらの 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) は、aconst 修飾なしに 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 をキャストし、それが参照している値を変更できます。

関連情報