2013-10-10 8 views
11

キャストについてのコードを少し説明してもらえますか?http://en.cppreference.com/w/cpp/types/aligned_storagestd :: aligned_storageのstatic_castとreinterpret_cast

次のコード

return *static_cast<const T*>(static_cast<const void*>(&data[pos])); 

return *reinterpret_cast<const T*>(&data[pos]); 

に置き換えることができますか?

なぜ2つのキャスティングが使用されるのですか? ありがとうございました。標準によれば香港

+1

これは、 'reinterpret_cast'の結果が標準で指定されていないため、適切な移植性/標準適合性のために必要なものと思われます。実際には、おそらくすべての実装やほぼすべての実装で同じことをするでしょう。 –

+2

2つはC++ 11で同等です。 – Simple

+0

@SteveJessop:私はそれが答えだと思います。 –

答えて

5

(5.2.10 reinterpret_cast、セクション7§):

オブジェクトへのポインタが明示的にディFF erentオブジェクトタイプへのポインタに変換することができます。タイプのprvalue vT1へのポインタを」タイプ「cv T2へのポインタ」に変換されるときT1T2両方が標準レイアウトタイプであり、T2の位置合わせ要件がT1のものよりも厳しくない場合、結果はstatic_cast<cv T2*>(static_cast<cv void*>(v))あります。

「T2へのポインタ」型に「T1へのポインタ」型のprvalue変換へ戻ると(T1T2がオブジェクト型であり、T2のアラインメント要件は全くT1のものより厳しくない場合)、その元の型は元のポインタ値を返します。 他のポインタ変換の結果は指定されていません。

だから、私たちは次のような結論作ることができます:

  1. reinterpret_cast<*T>(ptr)static_cast<*T>(static_cast<void*>(ptr))
  2. static_cast<>(ptr)にeqiuvalentであるが、常にptrに等しいではありませんが、そこにあればreinterpret_cast<>(ptr)は常にptr
  3. に等しく、アライメントの問題はありません。reinterpret_castを安全に使用できます。
関連する問題