Задать вопрос
@Mercury13
Программист на «си с крестами» и не только

C++, reinterpret_cast и const*: насколько переносим такой код?

«Велосипед», связанный с массивом переменной длины.

template <class Elem>
struct Buf1d
{
    size_t _size;
    Elem* _ptr;

    operator const Buf1d<const Elem>&() const
        { return reinterpret_cast<Buf1d<const Elem>&>(*this); }
}

Будто бы никаких проблем и две структуры, { size_t _size; int* _ptr; } и {size_t size; const int* _ptr; } внутри устроены гарантированно одинаково, ибо POD’ы. Прав я или не слишком?

P.S. Других полей нет, virtual нет, убраны лишь методы, не имеющие отношения к делу, наподобие operator[].
  • Вопрос задан
  • 2925 просмотров
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
1. добавление const в Buf1d<const Elem> не превращает { size_t _size; int* _ptr; } в { size_t _size; const int* _ptr; }, в лучшем случае -- в { const size_t _size; int* const _ptr; }
2. const T и T согласно C++98 3.9.3:1 представлены одинаково и имеют одинаковое выравнивание.
3. const T *p и T *p согласно тому же стандарту, 3.9.2:3 тоже имеют одинаковое представление и выравнивание.

Вывод: вы получили не то, что ожидали, но это корректно и переносимо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы