web-dev-qa-db-ja.com

static_castとreinterpret_castの違いは何ですか?

可能性のある複製:
static_cast、dynamic_cast、reinterpret_castはいつ使用する必要がありますか?

C++でc関数を使用しています。cでvoid型の引数として渡された構造体は、同じ構造体型に直接格納されます。

例:C.

_void getdata(void *data){
    Testitem *ti=data;//Testitem is of struct type.
}
_

c ++で同じことを行うには、static_castを使用します:

_void foo::getdata(void *data){
    Testitem *ti = static_cast<Testitem*>(data);
}
_

そして、私が_reinterpret_cast_を使用すると、同じ仕事をし、構造体をキャストします

Testitem *it=(Testitem *)data;を使用するとき

これも同じことを行います。しかし、これらの3つを使用すると、構造はどのように影響を受けますか。

48
HariHaraSudhan

static_castは、あるタイプから別のタイプへのキャストであり、(直感的に)ある状況下で成功し、危険なキャストがない場合に意味のあるキャストです。たとえば、static_castが実際にvoid*またはintを指す場合があるため、int* a void*int*にできます。このような変換は意味があるため、charに。ただし、static_castint*double*に変換することはできません。この変換は、int*が何らかの形でdouble*を指すようにマングルされている場合にのみ意味があります。

reinterpret_castは、ある値のビットを別の値のビットとして再解釈する可能性がある安全でない変換を表すキャストです。たとえば、int*double*にキャストすることはreinterpret_castで有効ですが、結果は指定されていません。同様に、intvoid*にキャストすることはreinterpret_castと完全に合法ですが、安全ではありません。

static_castreinterpret_castも、何かからconstを削除できません。これらのキャストを使用して、const int*int*にキャストすることはできません。これには、const_castを使用します。

(T)形式のCスタイルキャストは、可能であればstatic_castを実行しようとして定義され、それが機能しない場合はreinterpret_castにフォールバックします。絶対に必要な場合は、const_castも適用されます。

一般に、安全なキャストには常にstatic_castを好む必要があります。誤って明確に定義されていないキャストを実行しようとすると、コンパイラーはエラーを報告します。マシンの一部のビットの解釈を実際に変更している場合にのみreinterpret_castを使用し、reinterpret_castを実行するリスクがある場合にのみCスタイルのキャストを使用してください。場合によっては、static_castからのダウンキャストが状況によって明確に定義されるため、void*を使用する必要があります。

108
templatetypedef