const_cast
オブジェクトの constness をキャンセルすることはできません。オブジェクトへのアクセス パスconst_cast
から constness のみを削除できます。アクセス パスは、オブジェクトへのポインタまたは参照です。アクセス パスから constness を削除しても、オブジェクト自体にはまったく影響しません。アクセス パスの constness を削除するために使用しても、オブジェクトを変更する権限が付与されるとは限りません。それができるかどうかは、オブジェクト自体に依存します。const の場合、それを変更することは許可されておらず、変更しようとすると未定義の動作が発生します。const_cast
たとえば、これはconst_cast
int i = 5; // non-constant object
const int *p = &i; // `p` is a const access path to `i`
// Since we know that `i` is not a const, we can remove constness...
int *q = const_cast<int *>(p);
// ... and legally modify `i`
*q = 10;
// Now `i` is 10
上記が正当で有効である唯一の理由は、実際i
には非定数オブジェクトであり、私たちはそれについて知っているという事実です。
元のオブジェクトが実際に定数である場合、上記のコードは未定義の動作を生成します。
const int j = 5; // constant object
const int *p = &j; // `p` is a const access path to `j`
int *q = const_cast<int *>(p); // `q` is a non-const access path to `j`
*q = 10; // UNDEFINED BEHAVIOR !!!
C++ 言語では、定数オブジェクトを変更することはできconst_cast
ず、使用方法に関係なく、ここでは完全に無力です。
mutable
は全く別物です。mutable
含まれているオブジェクトが宣言されている場合でも、合法的に変更できるデータ ファイルを作成しますconst
。その意味でmutable
、定数オブジェクト[の指定された部分]を変更することができます。const_cast
、一方、そのようなことはできません。