reinterpret_cast はいつ使うのですか? 質問する

reinterpret_cast はいつ使うのですか? 質問する

reinterpret_castとの適用性について少し混乱していますstatic_cast。私が読んだところによると、一般的なルールは、型がコンパイル時に解釈できる場合は静的キャストを使用するというもので、そのために という単語が使われていますstatic。これは、C++ コンパイラが暗黙的なキャストにも内部的に使用するキャストです。

reinterpret_castは次の 2 つのシナリオに適用されます。

  • 整数型をポインタ型に変換し、その逆も行う
  • あるポインタ型を別のポインタ型に変換します。私が理解している一般的な考え方は、これは移植性がなく、避けるべきであるということです。

少し混乱しているのは、必要な使用法の 1 つです。C から C++ を呼び出しており、C コードは C++ オブジェクトを保持する必要があるため、基本的に が保持されます。と Class 型void*間の変換にはどのようなキャストを使用すればよいでしょうか。void *

static_castとの両方の使用法を見たことがありますreinterpret_castが、私が読んだところによると、コンパイル時にキャストを行うことができるので の方が良いようです。あるポインター型から別のポインター型に変換するには をstatic使用すると書かれていますが?reinterpret_cast

ベストアンサー1

C++ 標準では次のことが保証されます。

static_castへのポインタとからのポインタを とすると、void*アドレスが保持されます。つまり、次の式では、、aおよびbcすべて同じアドレスを指します。

int* a = new int();
void* b = static_cast<void*>(a);
int* c = static_cast<int*>(b);

reinterpret_castポインタを別の型にキャストし、それを元の型に戻すreinterpret_cast、元の値が返されることのみが保証されます。したがって、次のようになります。

int* a = new int();
void* b = reinterpret_cast<void*>(a);
int* c = reinterpret_cast<int*>(b);

aと にはc同じ値が含まれますが、 の値はb指定されていません。(実際には、aとと同じアドレスが含まれるのが一般的ですcが、これは標準では指定されておらず、より複雑なメモリ システムを備えたマシンでは当てはまらない場合があります。)

へのキャストや からのキャストにはvoid*static_castを優先する必要があります。

おすすめ記事