无法将unique_ptr添加到std :: array

时间:2016-03-10 02:54:19

标签: c++ arrays std unique-ptr

在浏览书籍和在线直到我的耳朵发生巨大痛苦之后,我无法弄清楚如何将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;

除最后一行外,所有内容都会编译。

3 个答案:

答案 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)

最后一行是尝试进行复制赋值操作,deletestd::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}}将被清除。