3

const_castとcスタイルのキャスト(ObjectType)の間に実際の違いはありますか?

4

6 に答える 6

11

Aconst_castは、Cキャストでは不可能な、キャストの背後にある意図に関する特定の情報を伝えます。

またはconst_castを追加または削除する以外の目的で誤ってを使用しようとすると、コンパイラがエラーメッセージを表示します。constvolatile

また、const_castCスタイルのキャストとは異なり、検索可能です。

于 2012-06-19T16:32:32.663 に答える
4

Aは-ness(または-ness、これはあまり一般的ではありませんが)const_castのみを追加または削除できます。constvolatile

dynamic_castCスタイルのキャストは、 (ここでは実際には関係ありませんが、いずれも実行できないいくつかのことを実行できることを除いて、すべての「新しい」キャストと同じように実行できます)。

于 2012-06-19T16:33:51.057 に答える
2

C ++でのCスタイルのキャストは、静的キャスト、再解釈キャスト、constキャスト、またはそれらの組み合わせを試みます。

主に...Cキャストを避けることをお勧めします。

  • reinterpretcastsとconstcastsはめったに使用されないので、自分がしていることを強調するのは良いことです。
  • また、静的キャストが必要な場合は、静的キャストを明示的に記述すると、Cキャストと比較して追加のコンパイル時チェックが提供されます。
于 2012-06-19T16:31:35.263 に答える
1

同じアクション。Cスタイルのキャストは、constをすべて同じようにキャストできます。

const_castの理由は、検索可能な危険信号として機能し、有罪を検索して慎重に確認/罰することができるためです。アイデアは、C ++はCよりもはるかに型タイトであるということです。したがって、型システムの意図的な違反(constの正確性の違反など)は、不可能ではないにしても、簡単に見つけることができます。

このような型安全性の違反を完全に不可能にすると、下位互換性が大幅に低下します。

于 2012-06-19T16:34:23.617 に答える
1

const_cast引数のconst-ness(またはvolatile-ness )のみを変更でき、基本タイプは変更できません。それで

 const T *tc = f();
 volatile T *tv = g();

 U *ua = const_cast<U*>(tc); //error
 U *ub = const_cast<U*>(tv); //error

 U *ub = (U*)(tc); //okay
 U *ub = (U*)(tv); //okay

したがって、c-styleキャストは、cv-qualifiedT*U*問題なく変更します。

于 2012-06-19T16:34:43.670 に答える
0

const_castはより制限されており、const-nessを変更する以外のことはできません。それはそれをより安全にします、すなわち事故を起こしにくいです。

さらに、検索が簡単です。

于 2012-06-19T16:34:21.163 に答える