> Я хочу обратное преобразование: от двойного * до двойного []. Что вы не можете получить: указатель не содержит информацию о длине массива. Однако вы знаете, что этот массив всегда имеет два элемента, поэтому: вы можете обращаться с указателем как с именем массива: 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