Учитывая код (действительно псевдокод):ли деструктор пустого unique_ptr ж/о пользовательском Deleter тривиального
struct A { /* ... */ }; // assume is non-trivial
struct B { /* ... */ }; // assume is non-trivial
using UA = std::unique_ptr<A>;
using UB = std::unique_ptr<B>;
union U
{
UA a;
UB b;
};
U u{std::make_unique<A>(/* init */)};
u.a = nullptr; // destructor of underlying type A called
// u.a.~UA(); // destructor of smart pointer itself
::new (&U.b) UB{std::make_unique<B>(/* init */)};
ли permittable опустить призвание деструктора для U::a
члена? Вопрос навеян следующие quote относительно std::unique_ptr::~unique_ptr
:
Если получить() == nullptr нет никаких эффектов.
Могу ли я считать, что d-tor в этом случае тривиален (описанный ниже смысл)?
Я думаю, что внутренний (и единственный в случае std::unique_ptr
ж/о пользовательских Deleter) элемента данных (скажем p
) из std::unique_ptr<T>
имеет тип T *
. После присвоения p = nullptr;
кажется, что это невозможно сделать с таким std::unique_ptr
, чтобы использовать его хранилище для других целей. Правильно ли это заключение?
@deviantfan Это просто оптимизация. В реальной части кода (класс с кучей вариантов) я должен поменять две 'U'-подобные структуры. В этом коде нет места ':: new', и поэтому не должно быть явных вызовов деструкторов (просто идиома). – Orient