void* を char* reinterpret_cast と static_cast に変換したいのですが、どちらが適していますか?static_cast<char*> or reinterpret_cast<char*>
5 に答える
それは主にスタイルの問題です。 static_cast
暗黙的な変換の反対である (および削除されないconst
or volatile
) 任意の変換を行うことができます。char*
tovoid*
は暗黙的である
ため、示されてstatic_cast
いるように見えます。通常のルールは、
可能な限りstatic_cast
に優先して使用することです。reinterpret_cast
この使用は特に危険であるため、一部のコーディング ガイドラインではreinterpret_cast
、この事実を知らせるために を好む場合があります。
reinterpret_cast
static_cast
ポインター型の間は、 throughに関して定義されますvoid *
。
5.2.10 キャストの再解釈 [expr.reinterpret.cast]
7 - [...] 型「ポインタへ」の prvalue
v
が型「ポインタへのcvT1
」に変換されるとき、結果は、との両方が標準レイアウト型であり、 の整列要件が の整列要件よりも厳密でない場合です。またはいずれかのタイプが.T2
static_cast<cv T2*>(static_cast<cv void*>(v))
T1
T2
T2
T1
void
したがって、 を介して標準レイアウトのオブジェクト ポインタ型 (例: 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* への変換など、本質的に安全ではない変換に使用できます。