我有这段代码将map从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;
^
答案 0 :(得分:8)
unique_ptr
是可移动的,但不可复制。 initializer_list
需要可复制的类型;你无法从initializer_list
移出一些东西。不幸的是,我相信你想做的事情是不可能的。
顺便说一句,了解您遇到的具体错误会更有帮助。否则,我们必须猜测你是否做错了什么,或者你想做什么没有在你的编译器中实现,或者只是语言不支持。 (这是最有用的,同时还有最少的复制代码。)
答案 1 :(得分:1)
作为一种解决方法,特别是当您希望const map
包含unique_ptr
时,您可以使用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;
}());
。它不是初始化列表,但结果类似:
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;
}());
甚至更简单,没有使用make_pair的typedef:
fleetctl