const_cast
オブジェクトの定数を取り消すことはできません。 const_cast
は、アクセスパスからオブジェクトへのconstnessのみを削除できます。アクセスパスは、オブジェクトへのポインタまたは参照です。アクセスパスからconstnessを削除することは、オブジェクト自体に全く影響を与えません。 const_cast
を使用してアクセスパスの定数を削除しても、それでも必ずオブジェクトを変更する権限が与えられるとは限りません。あなたがそれを行うことができるかどうかは依然としてオブジェクト自体に依存します。それがconstの場合、あなたはそれを変更することができません。そうしたい場合、未定義の動作になります。
たとえば、これは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
は、そのようなことはできません。
出典
2012-07-12 18:17:14
AnT