reinterpret_cast почти для данных pod (достаточно ли совместимости с макетом)

Я пытаюсь узнать о 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

8
задан Tom 21 February 2011 в 16:52
поделиться