暗黙的な_キャストとは何ですか? static_cast よりも Implicit_cast を好むのはいつですか?
4 に答える
別の場所でこのコメントに答えるために行ったコメントからコピーしています。
でダウンキャストできます
static_cast
。ではそうではありませんimplicit_cast
。static_cast
基本的に、暗黙的な変換を行うことができ、さらに暗黙的な変換の逆を行うことができます (いくつかの制限まで。仮想基本クラスが含まれている場合はダウンキャストできません)。ただし、暗黙的な変換のみimplicit_cast
を受け入れます。T が U の明示的なコンストラクタしか持たない場合は、ダウンキャストなし、 no 、 no 。void*->T*
U->T
キャストと変換の違いに注意することが重要です。以下では、キャストは行われません
int a = 3.4;
ただし、double から int への暗黙的な変換が行われます。キャストは常に明示的な変換要求であるため、「暗黙のキャスト」のようなものは存在しません。の名前構造boost::implicit_cast
は、「暗黙の変換を使用したキャスト」の素敵な組み合わせです。の実装全体は次のとおりです(ここでboost::implicit_cast
説明されています):
template<typename T> struct identity { typedef T type; };
template<typename Dst> Dst implicit_cast(typename identity<Dst>::type t)
{ return t; }
アイデアは、パラメーターに推定されていないコンテキストを使用することt
です。これにより、次のような落とし穴を回避できます。
call_const_version(implicit_cast(this)); // oops, wrong!
望んでいたのは、このように書き出すことです
call_const_version(implicit_cast<MyClass const*>(this)); // right!
コンパイラは、推定に使用されるパラメータの一部であるDst
ため、最初にテンプレートパラメータが何であるかを知る必要があるため、テンプレートパラメータがどのタイプを指定する必要があるかを推測できません。identity<Dst>
ただし、それはパラメーターに依存しますDst
(identity
一部のタイプでは明示的に特殊化できます)。ここで、循環依存関係が発生しました。標準では、そのようなパラメーターは推定されないコンテキストであり、明示的なテンプレート引数を提供する必要があるとだけ述べています。
あなたの状況で十分な場合は、implcit_cast を優先してください。Implicit_cast は static_cast よりも強力ではなく安全です。
たとえば、ベース ポインターから派生ポインターへのダウンキャストは、static_cast では可能ですが、implicit_cast では可能ではありません。両方のキャストでその逆も可能です。次に、基本クラスから派生クラスにキャストするときは、implicit_cast を使用します。これは、両方のクラスを混同しても安全に保つためです。
また、implicit_cast は多くの場合必要ないことにも注意してください。キャストをまったく使用しないと、ほとんどの場合、implicit_cast が機能するときに機能します。これが「暗黙的」の由来です。Implicit_cast は、たとえば、オーバーロードを回避するために、式の型を正確に制御する必要がある特別な状況でのみ必要です。
implicit_castはある型を別の型に変換し、暗黙のキャスト関数を記述して拡張して、ある型から別の型にキャストすることができます。
例えば
int i = 100;
long l = i;
と
int i = 100;
long l = implicit_cast<long>(i);
まったく同じコードです
ただし、次のようにimplicit_castをオーバーロードすることにより、独自の型に独自の暗黙のキャストを提供できます
template <typename T>
inline T implicit_cast (typename mpl::identity<T>::type x)
{
return x;
}
詳細については、 boost/implicit_cast.hppを参照してください。
お役に立てれば
編集
このページでは、implicit_cast New C++についても説明します。
また、static_castの主な機能は、あるタイプから別のタイプへの非変更またはセマンティック変換を実行することです。タイプは変更されますが、値は同じままです。
void *voidPtr = . . .
int* intPtr = static_cast<int*>(voidPtr);
この void ポインターを調べたいのですが、それが int ポインターであるかのように、ポインターは変化せず、内部では voidPtr は intPtr とまったく同じ値を持っています。Implicit_cast 、型は変更されますが、変換後の値も異なる可能性があります。
暗黙的な変換、明示的な変換、および static_cast はすべて別のものです。ただし、暗黙的に変換できる場合は明示的に変換でき、明示的に変換できる場合は静的にキャストできます。ただし、他の方向では同じではありません。暗黙のキャストと静的キャストの間には、完全に合理的な関係があります。前者は後者のサブセットです。
詳細については、C++ 標準のセクション 5.2.9.3 を参照してください。
それ以外の場合、式 e は、宣言 T t(e); いくつかの発明された一時変数 t (8.5) に対して、整形式です。
C++ では、プログラム内で変換が「見える」ようになるため、static_casts の使用が推奨されます。キャスト自体の使用は、一見の価値があるプログラマー強制ルールを示しているため、static_cast を使用することをお勧めします。