如何统一初始化unque_ptr的映射
How to uniform initialize map of unique_ptr?
我用下面的代码来初始化从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_ptr
的const 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;
}());
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- std::哈希表示无序映射中的唯一 PTR
- 将内存数据PTR映射到qt输入字段
- 插入无序映射将共享ptr变为null