0

我使用std::unique_ptr带有自定义删除器的 a 作为 a 的值,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

4

2 回答 2

5

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

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

于 2018-06-28T18:19:54.873 回答
0

The bug is in the default construction of the map entry before the assignment!

Sorry no time to work up the answer, but generally I would use insert instead?

于 2018-06-28T18:22:30.237 回答