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

时间:2018-06-28 18:13:37

标签: c++ unique-ptr stdmap stdmove

我将带有自定义删除器的console.log(apiKey)用作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); } ,但不会编译。

我在做什么错了?

您会在链接后看到错误。

https://wandbox.org/permlink/fKL4QDkUTDsj4gDc

2 个答案:

答案 0 :(得分:5)

如果键不存在,

a['k']将默认构造映射的值类型。由于您的unique_ptr使用自定义删除器,因此默认无法构建。您将必须使用map::emplace()map::insert()unique_ptr添加到地图。如果要在此之前知道元素是否存在,可以使用map::count()map::find()

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

答案 1 :(得分:0)

该错误在于分配前地图条目的默认构造!

很抱歉没有时间弄清楚答案,但是通常我会使用插入代替吗?