繁体   English   中英

无法使用带有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 ,但不会编译。

我究竟做错了什么?

您会在链接后看到错误。

https://wandbox.org/permlink/fKL4QDkUTDsj4gDc

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

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

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

对不起,没有时间来解决这个问题,但是通常我会使用插入代替吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM