无法使用带有 std::move 的自定义删除器插入 std::unique_ptr

Cannot insert std::unique_ptr with custom deleter with std::move

我使用带有自定义删除器的 std::unique_ptr 作为 std::map 的值,如下所示:

#include <iostream>
#include <memory>
#include <map>

void deleter(int* p){
    std::cout<<"Deleting..."<<std::endl;
    delete p;
}

int main()
{   
    std::map<char, std::unique_ptr<int, void(*)(int*)>> a;
    std::unique_ptr<int, void(*)(int*)> p{new int{3}, deleter}; 
    a['k'] = std::move(p);
}

插入值时,我使用std::move,但它不会编译。

我做错了什么?

您会看到 link 之后的错误。

https://wandbox.org/permlink/fKL4QDkUTDsj4gDc

如果key不存在,

a['k']会默认构造map的值类型。由于您的 unique_ptr 使用自定义删除器,因此它不是默认可构建的。您将不得不使用 map::emplace() or map::insert() to add the unique_ptr to the map. If you want to know if the element exists or not before you do so, you can use either map::count() or map::find().

如果您可以使用 C++17,则可以改用 map::try_emplace(),这只会在键不存在时添加对象,从而节省您的查找时间。

BUG出在赋值前默认构建的地图入口!

抱歉没时间想出答案,但通常我会使用 insert 代替?