C++ のキャスト

これは,C++プログラマであるかを見分ける10の質問 - Life like a clown の 「*_cast およびCスタイルのキャストそれぞれについて概要を説明せよ」と言う質問に対する回答的な記事です.この辺りからしばらくただの説明的なものになるのでざっと書いていきます.

C++ のキャストに関しては,http://www.s34.co.jp/cpptechdoc/article/newcast/ がコンパクトに纏まっています.

static_castはexprの型からtypeへの暗黙の型変換、あるいはtypeからexprへの暗黙の型変換が存在する場合にだけキャストします。キャスト不可能であればコンパイルエラーとなります。

reinterpret_castはtype(expr)が許されるなら、exprをtypeに単にキャストします。reinterpret_castは単なる型変更であり、たとえ派生関係があったとしてもポインタのアドレス自体はキャスト前と変わりません。その意味でreinterpret_castは非常に危険なキャストといえるでしょう。

const_castはconstおよびvolatile修飾子を無効にするだけのキャストを行ないます。そのほかのときはコンパイルエラーとします。

dynamic_castは基底クラスへのポインタ(or 参照)から派生クラスへのポインタ(or 参照)への型保証キャストを行ないます。上記3種のキャストはコンパイル時にキャストしますが、dynamic_castは実行時に型の検査が行なわれ、変換不可能であれば0を返します。dynamic_castにより、従来のキャストでは不可能であった クロス・キャスト、そして抽象基底クラスからのダウン・キャストが可能になりました。

http://www.s34.co.jp/cpptechdoc/article/newcast/

キャストの中で一番混乱する部分は static_cast と reinterpret_cast の違いですが,reinterpret_cast は値を保ったまま型情報のみを変更するのに対して,static_cast は必要に応じて値自体も変更します.

C スタイルのキャストは,C++ の static_cast, reinterpret_cast, const_cast の 3種類を纏めたものになります.

C形式のキャストは、

  1. const_cast
  2. static_cast
  3. static_castとconst_cast
  4. reinterpret_cast
  5. reinterpret_castとconst_cast

このような順番と組み合わせで表現できる。これらのキャストを上から順番に試していき、キャストが行えるところで、そのキャストを行う。

本の虫: 邪悪なC形式のキャストにしかできないこと