Здравствуйте, 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;
}