reinterpret_cast 演算子

C++reinterpret_cast 演算子 は、無関係の型の間の変換を扱います。

構文 - reinterpret_cast
 
>>-reinterpret_cast--<--Type-->--(--expression--)--------------><
 
 

reinterpret_cast 演算子は、引き数と同じビット・パターンを持っている、新規の型の値を作成します。 const または volatile 修飾をキャストすることはできません。 以下の変換を明示的に実行することができます。

ヌル・ポインター値は、宛先型のヌル・ポインター値に変換されます。

型 T の左辺値式およびオブジェクト x が与えられていると想定すると、 以下の 2 つの変換は同義です。

ISO C++ は、C スタイル・キャストもサポートします。 明示的なキャストの 2 つのスタイルは、構文は異なるけれども同じセマンティクスを持っています。 ポインターの一方の型をポインターの非互換型であるとする、どちら側からの再解釈も、通常無効です。 reinterpret_cast 演算子は、他の名前付きキャスト演算子と同様に、C スタイル・キャストよりも容易にスポットされ、 明示的キャストを可能にする、強くタイプされた言語の矛盾をハイライトします。

C++ コンパイラーは、全部ではないがほとんどの違反を検出し、静かに修正します。 プログラムがコンパイルされても、そのソース・コードが、 完全には正しくない場合があるということを覚えておくことは重要です。 プラットフォームによっては、パフォーマンスの最適化が、ISO 別名割り当て規則へ厳格に準拠して行われます。 C++ コンパイラーは、型ベースの別名割り当て違反についてヘルプしようと試みるけれども、 すべての可能なケースを検出することはできません。

次の例は、別名割り当て規則に違反しています。 しかし、C++ または K&R C で、最適化せずにコンパイルすると、期待通りに実行されます。 また、C++ で、これを最適化して正常にコンパイルできますが、ただし、必ずしも期待通りには実行さ れません。 問題の 7 行目は、x の古いまたは未初期化の値を印刷してしまいます。

1  extern int y = 7.;
2
3  int main() {
4       float x;
5       int i;
6       x = y;
7       i = *(int *) &x;
8       printf("i=%d. x=%f.¥n", i, x);
9  }

次のコードの例は、キャストが 2 つの異なるファイルにまたがっているので、 コンパイラーが検出すらもできない、誤ったキャストを含んでいます。

1  /* separately compiled file 1 */
2      extern float f;
3      extern int * int_pointer_to_f = (int *) &f; /* suspicious cast */
4
5  /* separately compiled file 2 */
6      extern float f;
7      extern int * int_pointer_to_f;
8      f = 1.0;
9      int i = *int_pointer_to_f;           /* no suspicious cast but wrong */

8 行目において、int i = *int_pointer_to_f がロード元としている同じオブジェクトを、 f = 1.0 が保管先としていることを、コンパイラーが知る方法はありません。

関連参照

IBM Copyright 2003