と について学ぼうとしていstatic_cast
ますreinterpret_cast
。
私が正しければ、標準 (9.2.18) はreinterpret_cast
、ポッドのデータは安全であると言っています:
を使用して適切に変換された POD 構造体オブジェクトへのポインターは、
reinterpret_cast
その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。[注: したがって、POD 構造体オブジェクト内に名前のないパディングが存在する場合がありますが、適切な配置を実現するために必要に応じて、先頭にはありません。— エンドノート]
私の質問は、これをどの程度厳密に解釈するかです。たとえば、レイアウトの互換性は十分ですか? もしそうでなければ、なぜですか?
私にとって、次の例は、厳密な「POD のみが有効である」という解釈が間違っているように見える例を示しています。
class complex_base // a POD-class (I believe)
{
public:
double m_data[2];
};
class complex : public complex_base
{ //Not a POD-class (due to constructor and inheritance)
public:
complex(const double real, const double imag);
}
double* d = new double[4];
//I believe the following are valid because complex_base is POD
complex_base& cb1 = reinterpret_cast<complex_base&>(d[0]);
complex_base& cb2 = reinterpret_cast<complex_base&>(d[2]);
//Does the following complete a valid cast to complex even though complex is NOT POD?
complex& c1 = static_cast<complex&>(cb1);
complex& c2 = static_cast<complex&>(cb2);
complex_base::m_data
また、保護されている場合 (complex_base
ポッドではないことを意味します) 、何が壊れる可能性がありますか? [編集: どうすれば自分自身を保護し、そのような破損を検出できますか]
レイアウトの互換性で十分であるように思えますが、これは標準が言っていることではないようです。
編集:答えてくれてありがとう。また、 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htmを見つけるのにも役立ちました