}
struct Point2 { int x; int y; }
Point p { .x = 11, .y = 22 };
Point2* p2 = reinterpret_cast<Point2*>(&p); // ???
Point2 p2 = reinterpret_cast<Point2>(p); // а так???
Первое можно, только если не разыменовывать потом, второе нет
Таки хочется как раз разыменовать, и достать оттуда x и у. Неужели единственный вариант - это пересоздавать структуру?
второе это однозначно некорректный код, который не должен (и не будет) компилироваться
Нет, нельзя
ты bitcast можешь сделать, тогда это будет правильно
Самое главное — это ни на фиг не нужно!
Хм, поищу, спасибо.
смотрите в пример реализации bit_cast, если 20 стандарт недоступен
Нужно, уж извини. Я знаю, что пересоздавать надёжно, но я неспроста пытаюсь избежать этого, хехе.
Спасибо, классно.
и чем поможет такая реализация bit_cast? `template <class _To, class _From, enable_if_t<conjunction_v<bool_constant<sizeof(_To) == sizeof(_From)>, is_trivially_copyable<_To>, is_trivially_copyable<_From>>, int> = 0> _NODISCARD constexpr _To bit_cast(const _From& _Val) noexcept { return __builtin_bit_cast(_To, _Val); } `
Ссылку можно было и открыть
а кто гарантирует эквивалентность бинарного представления двух этих структур? )
на cppref наверняка memcpy нарисован
Ну они одинаковые. Один компилятор. Одна ось. Одна битность. Или нужно, чтобы они в одном файле вообще лежали?
действительно, кто гарантирует что все int одинаковые ... 🙊
а разве они не такие по построению?
нужно чтобы стандарт гарантировал что они одинаковые, а стандарт этого не гарантирует )
Стандарт такого не требует. Если размеры одинаковы, они тривиально копируемы и внутри те же объекты, то можно
это в сишном стандарте
https://eel.is/c++draft/bit.cast#1
В сишном стандарте есть bit_cast?
тогда нафига оно надо этот bit_cast - непонятно)
не хватает оговорки на разные версии компилятора
чтобы в данном случаем успокоить ревнителей чистоты С++ и замедлить компиляцию :)
нет, в сишном стандарте есть понятие struct layout compatibility
Ну, как видите, в С++ таких требований нет. На уровне языка представление объектов одинаково, констрейнты выполняются, значит можно
В общем, через bit_cast, пожалуй, можно, но это же всё равно копия, не проще ли пересоздать?
Идея была в том, чтобы старую структуру интерпретировать как новую. Новая имела бы в точности такие же поля и опции выравнивания, но лежала бы в нужном классе, к которому имеют доступ другие классы.
Просто интерпретировать нельзя. Только скопировать(особым образом), либо создавать новый объект
Да, я понял. Благодарю.
Обсуждают сегодня