Я пытаюсь узнать о static_cast
и reinterpret_cast
.
Если я прав, стандарт (9.2.18) говорит, что reinterpret_cast
для данных pod безопасен:
Указатель на объект POD-struct, надлежащим образом преобразованный с использованием
reinterpret_cast
, указывает на его начальный элемент (или, если этот элемент является битовым полем, то на модуль, в котором он находится) и наоборот. [Примечание: поэтому внутри объекта POD-struct может быть безымянное заполнение, но не в его начале, поскольку это необходимо для достижения надлежащего выравнивания. — примечание в конце]
Мой вопрос заключается в том, как строго это интерпретировать. Достаточно ли, например, совместимости макета? И если нет, то почему?
Для меня следующий пример показывает пример, в котором строгая интерпретация «действительна только 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
не является pod)? [РЕДАКТИРОВАТЬ: и как мне защитить себя/обнаружить такие поломки]
Мне кажется, что компоновки-совместимости должно быть достаточно - но это не похоже на то, что говорит стандарт.
РЕДАКТИРОВАТЬ: Спасибо за ответы. Они также помогли мне найти это, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm