Ошибка, которую вы получаете, заключается в том, что лямбда-выражения не могут быть созданы по умолчанию. Когда вы объявляете p2
, вы не передаете аргумент для использования в качестве средства удаления, поэтому компилятор жалуется, что не может создать его по умолчанию.
Этот ответ уже охватывает чистый способ использования пользовательского средства удаления. Но если бы вам пришлось использовать разные средства удаления для объектов одного и того же класса, вам нужно было бы либо передать средство удаления при построении каждого интеллектуального указателя, либо использовать тип, который может быть создан по умолчанию, чтобы nullptr
мог иметь " null "объект удаления.
auto del = [](int *p) { cout << "obj deleted " << endl; delete p; };
int main() {
unique_ptr<int, std::function<void(int*)>> p1(new int(10), del);
unique_ptr<int, std::function<void(int*)>> p2;
p2 = std::move(p1);
}
Таким образом, вам не только не нужно назначать средство удаления, когда не существует управляемого объекта, но вы также можете определять и использовать другие средства удаления, которые всегда перемещаются вместе с объектом, с которым они созданы.