const_castとcスタイルのキャスト(ObjectType)の間に実際の違いはありますか?
6 に答える
Aconst_cast
は、Cキャストでは不可能な、キャストの背後にある意図に関する特定の情報を伝えます。
またはconst_cast
を追加または削除する以外の目的で誤ってを使用しようとすると、コンパイラがエラーメッセージを表示します。const
volatile
また、const_cast
Cスタイルのキャストとは異なり、検索可能です。
Aは-ness(または-ness、これはあまり一般的ではありませんが)const_cast
のみを追加または削除できます。const
volatile
dynamic_cast
Cスタイルのキャストは、 (ここでは実際には関係ありませんが、いずれも実行できないいくつかのことを実行できることを除いて、すべての「新しい」キャストと同じように実行できます)。
C ++でのCスタイルのキャストは、静的キャスト、再解釈キャスト、constキャスト、またはそれらの組み合わせを試みます。
主に...Cキャストを避けることをお勧めします。
- reinterpretcastsとconstcastsはめったに使用されないので、自分がしていることを強調するのは良いことです。
- また、静的キャストが必要な場合は、静的キャストを明示的に記述すると、Cキャストと比較して追加のコンパイル時チェックが提供されます。
同じアクション。Cスタイルのキャストは、constをすべて同じようにキャストできます。
const_castの理由は、検索可能な危険信号として機能し、有罪を検索して慎重に確認/罰することができるためです。アイデアは、C ++はCよりもはるかに型タイトであるということです。したがって、型システムの意図的な違反(constの正確性の違反など)は、不可能ではないにしても、簡単に見つけることができます。
このような型安全性の違反を完全に不可能にすると、下位互換性が大幅に低下します。
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*
問題なく変更します。
const_castはより制限されており、const-nessを変更する以外のことはできません。それはそれをより安全にします、すなわち事故を起こしにくいです。
さらに、検索が簡単です。