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

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

本文关键字:std 删除 插入 ptr unique 自定义 move      更新时间:2023-10-16

我使用带有自定义删除器的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(),这只会在键不存在时才添加对象,从而节省查找时间。

错误在于分配前映射条目的默认构造!

抱歉没有时间研究答案,但通常我会使用插入代替?