Если я перемещаю-конструкцию a
из b
, все же необходимо уничтожить b
, или я могу уйти без этого?
Этот вопрос перешел мне в голову при реализации шаблона optional<T>
. Выдержки:
~optional()
{
if (initialized)
{
reinterpret_cast<T*>(data)->~T();
}
}
optional(optional&& o) : initialized(o.initialized)
{
if (initialized)
{
new(data) T(std::move(*o)); // move from o.data
o.initialized = false; // o.data won't be destructed anymore!
}
}
Конечно, я мог бы просто заменить bool initialized
трехзначным перечислением, которое различает инициализированный, неинициализированный и перемещенный. Я просто хочу знать, нужно ли это строго.