> Я хочу обратное преобразование: от двойного * до двойного []. Что вы не можете получить: указатель не содержит информацию о длине массива. Однако вы знаете, что этот массив всегда имеет два элемента, поэтому: вы можете обращаться с указателем как с именем массива: double * p = кое-что (); р [0] = 1,0; р [1] = 2,0; потому что по определению arrayname [index] равно * (arrayname + index)

аюсь узнать оstatic_cast а такжеreinterpret_cast.

Если я прав, стандарт (9.2.18) говорит, чтоreinterpret_cast для стручка данных безопасно:

Указатель на объект 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 это не стручок)? [РЕДАКТИРОВАТЬ: и как мне защитить себя / обнаружить такие поломки]

Мне кажется, что компоновки совместимости должно быть достаточно, но это не то, что говорит стандарт.

РЕДАКТИРОВАТЬ: Спасибо за ответы. Они также помогли мне найти это,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm

Ответы на вопрос(2)

Ваш ответ на вопрос