const int i0 = 5;
//int i1 = const_cast<int>(i0); // compilation error
int i2 = (int)i0; // okay
int i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
const int i5 = (const int)i3; // okay
コンパイル エラーは、const をキャストしない/const を追加しないために発生します。代わりに、i0 をコピーします。その操作では、キャストはまったく必要ありません。
int i1 = i0;
const int i4 = i3;
キャスト先の型は、実際にはポインターまたは参照である必要があります。それ以外の場合は、 const_cast をそのままコピーできるため、使用しても意味がありません。たとえば、ポインターの場合、const をキャストすることができます。これは、ポインターを逆参照すると、a const T*
(yields const T
)とは別の型 ( T*
yields ) が生成されるためT
です。参照の場合も同様です。は、 を使用するのではなく、別のthisポインター型をT&
使用してオブジェクトにアクセスします。今、あなたが本当にアーカイブしたかったもの:const T&
const int i0 = 5;
//int & i1 = const_cast<int&>(i0); // okay (but dangerous)
int & i2 = (int&)i0; // okay (but dangerous)
int i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
const int&i5 = (const int&)i3; // okay too!
上記は、非 const への参照を介して元の const オブジェクトに書き込むと、未定義の動作につながる可能性があります (実際には、キャストして読み取るだけでは未定義の動作ではありません。ただし、const をキャストする場合は、また、それに書き込むと、未定義の動作が発生します)