Re: Placement new для инициализации примитивного типа в самодельном union?
От: rg45 СССР  
Дата: 03.10.25 11:31
Оценка:
Здравствуйте, so5team, Вы писали:

S>Но вот нужен ли с формальной точки зрения placement new когда мне требуется туда сохранить значение указателя?

S>
S>template< typename T >
S>void
S>store_to( my_union_t<T> & dest, void_ptr_t value )
S>{
S>  *(reinterpret_cast<void_ptr_t **>(dest._content.data())) = value;
S>}
S>

S>?

S>Оно как бы понятно, что современные компиляторы без проблем возьмут и версию с reinterpret_cast. Но хочется понять, насколько это легально.


Если я правильно понимаю, то согласно 7.2.1/11 это UB.

S>Сам думаю, что легальной является только версия с placement new и для T, и для void_ptr_t. Однако, не мешало бы получить какие-то подтверждения от знающих людей, чтобы быть уверенным.


Я думаю, что здесь можно было бы заюзать std::start_lifetime_as:

template< typename T >
void
store_to( my_union_t<T> & dest, void_ptr_t value )
{
  *std::start_lifetime_as<void_ptr_t>(dest._content.data()) = value;
}
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.