9

次のテンプレート関数を使用して、任意の標準タイプのデータをバイナリ出力ストリームにダンプします。

template<typename T> static void
dump ( const T& v, ostream& o ) {
    o.write ( reinterpret_cast<const char*>(&v), sizeof(T));
}

reinterpret_castの代わりに、Cスタイル(const char *)を使用することもできます。reinterpret_castを使用する特別な理由はありますか?reinterpret_castが眉をひそめた他のいくつかの投稿を読みました。しかし、上記の使用法は合法であり、他のものに置き換えることはできませんよね?

4

4 に答える 4

14

Cスタイルのキャストの問題は、内部で多くのことを行うことです。詳細な説明については、こちらをご覧ください:http: //anteru.net/2007/12/18/200/

常にC++キャストを使用するようにしてください。これにより、長期的には作業が楽になります。この場合のCスタイルのキャストの主な問題は、を(char*)(&v)使用して記述できた可能性があることです。reinterpret_cast追加のが必要const_castになるため、少し安全です。reinterpret_castさらに、Cスタイルのキャストでは不可能な正規表現で簡単に見つけることができます。

于 2011-12-08T06:34:18.123 に答える
6

違いはありません。与えられた状況では、C スタイルのキャストはまさに「再解釈」キャストです。

C++ スタイルのキャストを優先すべき理由は、キャスト対象が明示的であるためです。C スタイルのキャストは、必要に応じて常に可能な限り粗いキャストにフォールバックしようとしますが、C++ スタイルのキャストは、意図したとおりに可能な場合にのみコンパイルされます。静的キャストは、値が変換可能であるか、ポインター/参照のいずれかである場合にのみ成功します。は互換性があり、const-cast は、ソースとターゲットが相互に cv 修飾されたバージョンである場合にのみ機能します。再解釈キャストは、基になるバイナリ表現を調べたいことを明示的に示します。(有効な再解釈キャストは、より大きなトリックの一部でない限り、通常、 void または char ポインターへのキャストのみであることに注意してください。)

于 2011-12-08T06:42:19.627 に答える
4

C スタイルのキャスティングは非常に危険です。そのため、C++ categorical は、典型的な使用法に基づいてキャストを以下の型に分割しました。

dynamic_cast(expression) - 適切なクラス階層間のキャストを許可します。

const_cast(expression) - const-ness をキャストします。

static_cast(expression) - ある程度 C スタイルですが、型間の非互換性を尊重し、許可しません。

reinterpret_cast(expression) - それでも要件が満たされない場合は、これを使用できます。C スタイルのキャストですが、名前があります。そのため、大規模なコード ベースで簡単に見つけることができます。

注:- ほとんどの「reinterpret_cast」は、適切な設計で排除できます。言い換えれば、「reinterpret_cast」が必要になるということは、ほとんどの場合、設計に何か問題があるということです。

更新: これは最後のオプションである必要があり、上記の場合、使用法は正しいです。ここで reinterpret_cast に言及すると、ライターが意図的に型の安全性を気にしないことを選択したという印象を読者に与えます。しかし、c スタイルのキャストを使用しても、そのような印象はありません。

于 2011-12-08T07:01:38.730 に答える
1

reinterpret_caststatic_castまたはの代わりに使用されると、眉をひそめられますdynamic_cast。C キャストを置き換えるために使用することをお勧めします。

新しいキャストには、C スタイルのキャストよりも利点があります。1 つは、実際に必要なキャストを制限できること、もう 1 つは、C キャストよりも新しいキャストをテキストで検索する方がはるかに簡単であることです。

于 2011-12-08T06:40:41.353 に答える