9

次の理由は?:

  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
4

4 に答える 4

21
  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 をキャストする場合は、また、それに書き込むと、未定義の動作が発生します)

于 2008-12-16T06:36:12.103 に答える
5

標準では許可されていないため、エラーです。標準では、実行できる変換の種類が列挙さconst_castれており、リストにないものはすべて禁止されています。これにより、次のことが可能になります。

  • ポインター
  • 参考文献
  • メンバーポインター

あなたのタイプはそれらのいずれでもないため、許可されていません。

明るい面では、あなたが与えた例も必要あり ませんconst_cast

于 2008-12-16T07:01:08.887 に答える
0

最初のエラーについて。const_cast は、ポインターまたは参照型でのみ使用できます。「int」はどちらでもありません。これは C++ 標準である場合とそうでない場合があります (適切なリファレンスが見つかりませんでした)。ただし、MS の C++ コンパイラなどの特定の実装には当てはまります。

2番目のエラーについて。const_cast は、const または volatile 修飾子を追加するのではなく、削除するためにのみ使用できます。

参照: http://msdn.microsoft.com/en-us/library/bz6at95h(VS.80).aspx

于 2008-12-16T06:35:43.680 に答える