式 reinterpret_cast<T >(v) は式 v の値の解釈を変更します。この式は、ポインタ型と整数型の間、2 つの無関係なポインタ型の間、ポインタ型からメンバー型へ、ポインタ型から関数型へ、という各種の変換に使用できます。
reinterpret_cast 演算子を使用すると、未定義の結果または実装に依存しない結果を出すことがあります。次に、確実な動作について説明します。
データオブジェクトまたは関数へのポインタ (メンバーへのポインタは除く) は、それを十分保持できる大きさの任意の整数型に変換できます。long 型は十分大きいため、C++ コンパイラがサポートするアーキテクチャーでは常にポインタ値を保持できます。元の型に戻しても、値は元の値と同じになります。
(非メンバー) 関数へのポインタは、別の (非メンバー) 関数型へのポインタに変換できます。元の型に戻しても、値は元の値と同じになります。
新しい型が元の型よりも厳しい整列条件を持たない場合、オブジェクトへのポインタは別のオブジェクト型へのポインタに変換できます。元の型に戻しても、値は元の値と同じになります。
reinterpret_cast 演算子を使用して型「T1 のポインタ」の式を型「T2 のポインタ」に変換できる場合、型 T1 の左辺値は型「T2 の参照」に変換できます。
T1 と T2 の両方が関数型であるか両方がオブジェクト型である場合、「型 T1 の Xのメンバーを指すポインタ」型の右辺値は、「型 T2 の Y のメンバーを指すポインタ」型の右辺値に明示的に変換できます。
変換が許可されている場合は、ある型のヌルポインタは別の型のヌルポインタに変換されたあともヌルポインタのままです。
reinterpret_cast 演算子を使用して、const を const でない型にキャストすることはできません。このようにキャストするには const_cast を使用します。
reinterpret_cast 演算子を使用して、ポインタと、同じクラス階層に存在する別のクラスの間の変換を行うことはできません。このように変換するには、静的キャストまたは動的キャストを使用します。reinterpret_cast は、必要があっても調整は行いません。これを次の例で説明します。
class A {int a; public: A();}; class B: public A {int b, c;}; void use_of_reinterpret_cast() { A a1; long l = reinterpret_cast<long>(&a1); A* ap = reinterpret_cast<A*>(l); // safe B* bp = reinterpret_cast<B*>(&a1); // unsafe const A a2; ap = reinterpret_cast<A*>(&a2); // error, const removed } |