void* を char* reinterpret_cast と static_cast に変換したいのですが、どちらが適していますか?static_cast<char*> or reinterpret_cast<char*>
5 に答える
それは主にスタイルの問題です。 static_cast暗黙的な変換の反対である (および削除されないconstor volatile) 任意の変換を行うことができます。char*tovoid*は暗黙的である
ため、示されてstatic_castいるように見えます。通常のルールは、
可能な限りstatic_castに優先して使用することです。reinterpret_cast
この使用は特に危険であるため、一部のコーディング ガイドラインではreinterpret_cast、この事実を知らせるために を好む場合があります。
reinterpret_caststatic_castポインター型の間は、 throughに関して定義されますvoid *。
5.2.10 キャストの再解釈 [expr.reinterpret.cast]
7 - [...] 型「ポインタへ」の prvalue
vが型「ポインタへのcvT1」に変換されるとき、結果は、との両方が標準レイアウト型であり、 の整列要件が の整列要件よりも厳密でない場合です。またはいずれかのタイプが.T2static_cast<cv T2*>(static_cast<cv void*>(v))T1T2T2T1void
したがって、 を介して標準レイアウトのオブジェクト ポインタ型 (例: char *) 間void *で変換する場合は、 との間static_castの変換に適していvoid *ます。
static_cast(と一緒にdynamic_cast) は、同じクラス階層内のオブジェクト間でキャストするためのものであり、reinterpret_castは異なる型間で完全にキャストするためのものです。したがって、あなたの場合はreinterpret_cast.
reinterpret_castこの場合は が機能しますが、最も危険なキャストであるため、頻繁に使用しないでください。基本的に、reinterpret_castまったく無関係なポインターを使用できるため、結果を処理する (つまり、結果が今後の使用に有効かどうかを確認する) のはユーザーの義務です。
コンテキストに依存すると思います。暗黙的な変換がある場合は、 static_cast<> を使用する必要があります。両方のポインターの型が異なる場合は、reinterpret_cast<> を使用する必要があります
reinterpret_cast は推奨されませんが。
継承階層をキャストダウンするために static_cast を使用するのではなく、dynamic_cast を使用する必要があります。
http://msdn.microsoft.com/en-us/library/e0w9f63b(v=vs.80).aspxから
reinterpret_cast 演算子は、char* から int* への変換、One_class* から Unrelated_class* への変換など、本質的に安全ではない変換に使用できます。