如何统一初始化unque_ptr的映射

How to uniform initialize map of unique_ptr?

本文关键字:ptr 映射 unque 何统一 初始化      更新时间:2023-10-16

我用下面的代码来初始化从into到unique_ptr的映射。

auto a = unique_ptr<A>(new A());
map<int, unique_ptr<A>> m;
m[1] = move(a);

我可以使用统一初始化这个吗?我试着

map<int, unique_ptr<A>> m {{1, unique_ptr<A>(new A())}};    

但是我得到了一个错误。

错误信息的一部分是

In instantiation of 'std::_Rb_tree_node<_Val>::_Rb_tree_node(_Args&& ...) [with _Args = {const std::pair<const int, std::unique_ptr<A, std::default_delete<A> > >&}; _Val = std::pair<const int, std::unique_ptr<A> >]': ... In file included from /opt/local/include/gcc48/c++/memory:81:0,
                 from smart_pointer_map.cpp:3: /opt/local/include/gcc48/c++/bits/unique_ptr.h:273:7: error: declared here
       unique_ptr(const unique_ptr&) = delete;
   ^

unique_ptr是可移动的,但不可复制。initializer_list要求可复制类型;你不能从initializer_list中取出任何东西。很遗憾,我相信你想做的事是不可能的。

顺便说一下,知道你得到了哪个特定的错误会更有帮助。否则,我们必须猜测您是否做错了什么,或者您想做的事情是否在编译器中没有实现,或者语言中根本不支持。(这与最小的复制代码一起非常有用)

作为一种变通方法,特别是当您想要包含unique_ptrconst map时,您可以使用就地执行的lambda。它不是初始化列表,但结果是相似的:

typedef std::map<uint32_t, std::unique_ptr<int>> MapType;
auto const mapInstance([]()
{
   MapType m;
   m.insert(MapType::value_type(0x0023, std::make_unique<int>(23)));
   return m;
}());

或者更简单,不用使用make_pair:

auto const mapInstance([]()
{
   std::map<uint32_t, std::unique_ptr<int>> m;
   m.insert(std::make_pair(0x0023, std::make_unique<int>(23)));
   return m;
}());