无法使用带有 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 之后的错误。
如果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 代替?
我使用带有自定义删除器的 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 之后的错误。
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 代替?