在浏览书籍和在线直到我的耳朵发生巨大痛苦之后,我无法弄清楚如何将std::unique_ptr
添加到std::array
。
以下是班级成员:
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;
除最后一行外,所有内容都会编译。
答案 0 :(得分:3)
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);
~~~~~~~~~
BTW:正如@ M.M所提到的,使用std::unique_ptr::reset
也可以解决你的问题,并且通过避免所有临时变量来更清楚。
m_collection[0].reset(CreateNewMedia(Media info stuff));
答案 1 :(得分:3)
最后一行是尝试进行复制赋值操作,delete
为std::unique_ptr
d。您需要使用移动赋值运算符:
m_collection[0] = std::move(np);
答案 2 :(得分:3)
您无法复制unique_ptr
,句号。那是什么&#34;独特&#34;意味着 - 只有一个 unique_ptr
指向同一个对象。
现在,您可以将unique_ptr
分配给另一个,但这会清除原始的a = b
。如果b
修改std::move
,那么真的会让人感到困惑,你必须明确指出你想要m_collection[0] = std::move(np);
:
m_collection[0]
在此行之后,Media
将指向np
对象,{{1}}将被清除。