Здравствуйте, andrey.desman, Вы писали:
S>>В моем же случае внутри последовательности байт нужно разместить новый объект примитивного типа и корректно начать его lifetime с точки зрения языка.
AD>Да, для этого в 23 плюсах ввели std::start_lifetime_as. Если 23 нет, placement new будет безопасным вариантом (вместе с ручным вызовом деструктора при пересоздании).
В теории C++23 есть, но т.к. код должен компилироваться и на Linux, и на Windows, а Linux-ы могут быть нескольких вариантов и где-то std::start_lifetime_as может и не оказаться.
Однако, как я понимаю, тогда работа будет выглядеть как-то так:
// Сохранение значения.
template< typename T >
void
store_to( my_union_t<T> & dest, void_ptr_t value )
{
std::memcpy( dest._content.data(), &value, sizeof(value) );
}
// Извлечение значения в виде указателя.
[[nodiscard]]
template< typename T >
void_ptr_t
read_pointer( const my_union_t<T> & src )
{
return *(std::start_lifetime_as<const void_ptr_t *>(src._content.data()));
// Тут еще поди догадайся чей lifetime начинается.
}
Есть ощущение, что вариант с placement new окажется и лаконичнее, и понятнее.