Я пытаюсь узнать о static_cast
и reinterpret_cast
.
Если я прав, стандарт (9.2.18) говорит, что reinterpret_cast
для данных модуля безопасен:
Указатель на объект структуры POD, соответствующим образом преобразованный с использованием
reinterpret_cast
, указывает на свой начальный член (или если этот член битовое поле, затем в блок, в котором он находится) и наоборот. [Примечание: поэтому может быть безымянный заполнение внутри объекта POD-структуры, но не в его начале, как необходимо для достижения соответствующее выравнивание. - конец note]
Мой вопрос в том, насколько строго это интерпретировать. Достаточно ли, например, компоновки? а если нет, то почему?
Для меня следующий пример показывает пример, в котором строгая интерпретация «только 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(d[0]);
complex_base& cb2 = reinterpret_cast(d[2]);
//Does the following complete a valid cast to complex even though complex is NOT POD?
complex& c1 = static_cast(cb1);
complex& c2 = static_cast(cb2);
Кроме того, что может сломаться, если complex_base :: m_data
защищен (это означает, что комплексная_база
не является подом)? [РЕДАКТИРОВАТЬ: и как мне защитить себя / обнаружить такие поломки]
Мне кажется, что совместимости макета должно быть достаточно - но это не похоже на то, что говорит стандарт.
РЕДАКТИРОВАТЬ: Спасибо за ответы. Они также помогли мне найти это, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm