Если я перемещаю-конструирую a
из b
, нужно ли разрушить b
, или я могу уйти, не делая этого?
Этот вопрос пришел мне в голову во время реализации необязательного шаблона
. Выдержка:
~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
на трехзначное перечисление, которое различает инициализированные, неинициализированные и перемещенные. Я просто хочу знать, действительно ли это необходимо.