Когда необязательный объект, который содержит значение, перемещается из (является источником конструктора движения или назначения), он все еще содержит значение, и его содержащее значение остается в перемещенном состоянии. Это можно проиллюстрировать следующим примером.
optional<std::unique_ptr<int>> opi {std::make_unique<int>(1)};
optional<std::unique_ptr<int>> opj = std::move(opi);
assert (opi);
assert (*opi == nullptr);
Многие люди ожидают, что когда объект, содержащий ценность, перемещается, его содержащая ценность должна быть уничтожена. Это не так, по причинам эффективности. Текущая семантика позволяет реализовать<boost::opiotnal<T>>, чтобы быть тривиально копируемым, когда<T>является тривиальным.