Когда
std::vector создаёт новый элемент из std::move(s), исходный s остаётся в своей области видимости. При выходе из неё C++ всё равно вызывает деструктор: специальную функцию, которая срабатывает при уничтожении объекта. Если внутри есть системный вызов или удаление записи из общего реестра, даже перемещённый объект может выполнить лишнюю работу.ManualDrop отделяет время жизни объекта от памяти, в которой он лежит. Обёртка убирает автоматический вызов деструктора и позволяет вызвать его явно либо переместить значение в другой объект с автоматическим уничтожением.
В разборе с исходным кодом повторите пример со
std::vector сначала без ManualDrop, затем с ним. Сравните вывод конструкторов и деструкторов. Используйте приём только там, где значение гарантированно будет перемещено из своей области видимости.
