reinterpret_cast para quase dados de pod (a compatibilidade de layout é suficiente)

Estou tentando aprender sobrestatic_cast ereinterpret_cast.

Se eu estiver correto, o padrão (9.2.18) diz quereinterpret_cast para dados do pod é seguro:

Um ponteiro para um objeto POD-struct, convertido adequadamente usando umreinterpret_cast, aponta para seu membro inicial (ou se esse membro é um campo de bits, depois para a unidade em que reside) e vice-versa. [Nota: Portanto, pode haver preenchimento sem nome em um objeto POD-struct, mas não no início, conforme necessário para obter o alinhamento apropriado. - nota final]

Minha pergunta é quão estritamente interpretar isso. Por exemplo, a compatibilidade de layout é suficiente? E se não, por que não?

Para mim, o exemplo a seguir mostra um exemplo em que uma interpretação estrita de 'apenas POD é válido' parece estar errada.

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);

Além disso, o que pode quebrar secomplex_base::m_data está protegido (o que significa quecomplex_base não é pod)? [EDIT: e como me proteger / detectar tais rupturas]

Parece-me que a compatibilidade de layout deve ser suficiente - mas isso não parece ser o que o padrão diz.

EDIT: Obrigado pelas respostas. Eles também me ajudaram a encontrar isso,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm

questionAnswers(2)

yourAnswerToTheQuestion