Re[4]: Placement new для инициализации примитивного типа в самодельном union?
От: so5team https://stiffstream.com
Дата: 03.10.25 06:18
Оценка:
Здравствуйте, 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 окажется и лаконичнее, и понятнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.