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