无法将unique_ptr添加到 std::array
Cannot add a unique_ptr to a std::array
在搜索书籍和在线直到耳朵之间出现剧烈疼痛后,我不知道如何在std::array
中添加std::unique_ptr
。
下面是一个类成员:
std::array<std::unique_ptr<Media>, MAX_ELMS_NUM> m_collection;
在.cpp
文件中,我尝试将填充在数组std::unique_ptr
中的新媒体指针添加到数组中:
Media* newMedia = CreateNewMedia(Media info stuff);
unique_ptr<Media> np(newMedia);
m_collection[0] = np;
除最后一行外,所有内容都编译。
最后一行是尝试执行复制赋值操作,对于std::unique_ptr
delete
d。 您需要使用移动分配运算符:
m_collection[0] = std::move(np);
你不能复制unique_ptr
,句号。这就是"唯一"的含义——只有一个unique_ptr
指向同一个对象。
现在,您可以将unique_ptr
分配给其他,但这会清除原始。由于如果修改a = b
b
会非常令人困惑,因此您必须明确指出您想要这样做,并std::move
:
m_collection[0] = std::move(np);
在此行之后,m_collection[0]
将指向Media
对象,np
将被清除。
std::unique_ptr
不能被复制,而是被移动,因为它是唯一的。您可以使用std::move
.
类 (std::unique_ptr) 满足 MoveConstructible 和 MoveAssignable 的要求,但不能满足 CopyConstructible 或 CopyAssignable 的要求。
std::move 用于表示对象 t 可以"从"移动,即允许资源从 t 有效地转移到另一个对象。
Media* newMedia = CreateNewMedia(Media info stuff);
unique_ptr<Media> np(newMedia);
m_collection[0] = std::move(np);
~~~~~~~~~
顺便说一句:正如@M.M所提到的,使用std::unique_ptr::reset
也可以解决你的问题,并且通过避免所有临时变量而更加清晰。
m_collection[0].reset(CreateNewMedia(Media info stuff));
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用std::transform将一个范围的元素添加到另一个范围中
- 是否将std::packaged_task添加到现有线程
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 为什么"std::add_pointer"会添加之前删除的"const"?
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- std 不包含,但它应该添加库
- 向 std::list 添加新元素的复杂性
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 我可以在"std"命名空间中添加推理指南吗?
- c++17在编译时将带有已删除复制构造函数的类添加到std::vector
- 如何将全局std::map添加到chaiscript
- 为什么 memcpy() 是一种将元素添加到 'std::map' 的方法?
- 在具有 std::p air 键和值的映射中添加 b2vec2
- 替换现有条目并在 std::map 中添加新条目
- 将 std::文件系统头文件添加到我的程序时出现编译错误
- 如何有条件地将元素添加到 std::array - C++11
- 将指向结构数组的指针添加到 std::map
- 在Visual Studio 2017中,有没有一种快速的方法可以将"std::"添加到缺少它的名称中?