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
およびb
はc
すべて同じアドレスを指します。
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
を優先する必要があります。