无法使用带有 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()
,这只会在键不存在时才添加对象,从而节省查找时间。
错误在于分配前映射条目的默认构造!
抱歉没有时间研究答案,但通常我会使用插入代替?
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- C++删除未使用的类属性会导致 std::logic_error
- 如何在向量中删除 std::function<void()>?
- std::ofstream 作为类成员删除复制构造函数?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- std::d ecay 并删除 const 限定符
- 为什么"std::add_pointer"会添加之前删除的"const"?
- C++ VS 错误:<实验/文件系统>提供 std::experimental::文件系统的标头已被Microsoft弃用,将被删除
- 从其存储的回调中删除 std::函数是否安全
- C++从 std::vector<std::function<中删除 std::function>>
- 为什么std ::删除文件始终返回-1
- 为什么我无法使用CreateFile Win32 API打开文件RW,但可以使用STD ::删除将其删除
- std:删除元素后,字符串容量保持不变,所以它是否占用了一些内存
- 我应该使用std ::删除以从列表中删除元素
- std::删除指定元素的矢量
- 使用 std::删除删除错误的字符