C++ 在地图中存储具有自定义删除器的唯一\u ptr

C++ 在地图中存储具有自定义删除器的唯一\u ptr,c++,unique-ptr,C++,Unique Ptr,为什么这样不行 #include <map> #include <memory> void deleter(int* i) { delete i; } std::map<int, std::unique_ptr<int, decltype(&deleter)>> m; void foo(int* i) { m[0] = std::unique_ptr<int, decltype(&deleter)>

为什么这样不行

#include <map>
#include <memory>

void deleter(int* i) {
    delete i;
}

std::map<int, std::unique_ptr<int, decltype(&deleter)>> m;

void foo(int* i) {
    m[0] = std::unique_ptr<int, decltype(&deleter)>(i, &deleter);
}
#包括
#包括
无效删除器(int*i){
删除i;
}
std::map m;
无效foo(int*i){
m[0]=std::unique_ptr(i,&deleter);
}
检查不可理解的编译错误

包含在以下文件中:1:
在/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../include/c++/8.2.0/map:61中包含的文件中:
在/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../include/c++/8.2.0/bits/stl_map.h:63中包含的文件中:
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../include/c++/8.2.0/tuple:1668:9:错误:“std::unique\u ptr”的初始化没有匹配的构造函数
第二个(std::forward(std::get(_tuple2))…)
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../include/c++/8.2.0/tuple:1655:9:注意:在函数模板专门化的实例化中,此处请求“std::pair::pair”
:配对(_第一,_第二,
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../../include/c++/8.2.0/ext/new_allocator.h:136:23:注意:在函数模板专门化的实例化中,此处请求“std::pair::pair”
{::新建((void*)uu p)u向上(std::转发(u参数));}
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../../include/c++/8.2.0/bits/alloc_traits.h:475:8:注意:在函数模板专门化的实例化中,此处请求了“\u gnu_cxx::new_分配器::construct”
{{uu a.构造({uu p,std::forward({uu args)…);}
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../include/c++/8.2.0/bits/stl_tree.h:637:23:注意:在函数模板专门化的实例化中,此处请求了“std::allocator_traits::construct”
_Alloc_traits::construct(_M_get_Node_allocator(),
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../../include/c++/8.2.0/bits/stl_tree.h:654:4:注意:在函数模板专门化的实例化中,std:_Rb_tree::_construct_node'
_M_构造_节点(u tmp,std::forward(u args)…);
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../../include/c++/8.2.0/bits/stl_tree.h:2414:19:注意:在函数模板专门化的实例化中“std:_Rb_tree::_M_create_node”
_Link_type_uuz=_M_create_节点(std::forward(u参数)…);
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../../include/c++/8.2.0/bits/stl_map.h:518:15:注意:在函数模板专门化的实例化中,这里请求了“std:_Rb_tree:_implace_hint_unique”
__i=_M_t._M_emplace_hint_unique(u i,std::分段构造,
^
:11:6:注意:在实例化此处请求的成员函数“std::map::operator[]”时
m[0]=std::unique_ptr(i,&deleter);
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:191:12:注意:忽略候选模板:替换失败[with _Up=void(*)(int*)]:在“std::enable_if”中没有名为“type”的类型
constexpr unique_ptr()noexcept
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:204:2:注意:候选构造函数模板不可行:需要单个参数“\u p”,但未提供任何参数
唯一\u ptr(指针\u p)无异常
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:236:12:注意:候选构造函数模板不可行:需要1个参数,但提供了0
constexpr unique_ptr(nullptr_t)noexcept:unique_ptr(){}
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:255:2:注意:候选构造函数模板不可行:需要单个参数“u”,但未提供任何参数
唯一的(唯一的)无例外
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:265:2:注意:候选构造函数模板不可行:需要单个参数“u”,但未提供任何参数
唯一(自动)无例外;
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:241:7:注意:候选构造函数不可行:需要单个参数“u”,但未提供任何参数
唯一的(唯一的)无例外
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:394:7:注意:候选构造函数不可行:需要1个参数,但提供了0
唯一\u ptr(const unique \u ptr&)=删除;
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:215:7:注意:候选构造函数不可行:需要2个参数,但提供了0
唯一指针,
^
/opt/compiler explorer/gcc-8.2.0/lib/gcc/x86_64-linux-gnu/8.2.0/../../../../../../../../include/c++/8.2.0/bits/unique_ptr.h:227:7:注意:候选构造函数不可行:需要2个参数,但提供了0
唯一指针,
^
生成1个错误。
返回的编译器:1

std::unique\u ptr
在使用像您这样的自定义删除函数时,不是默认可构造的。
std::map::operator[]
要求映射的值类型是默认可构造的。这意味着您不能将
operator[]
用于此类型的映射

为了使
std::unique_ptr
成为默认可构造的,您需要一个满足where的删除器
struct Deleter {
    void operator()(int* i) { delete i; }
};

std::map<int, std::unique_ptr<int, Deleter>> m;

void foo(int* i) {
    m[0] = std::unique_ptr<int, Deleter>(i);
}