无法将unique_ptr添加到 std::array

Cannot add a unique_ptr to a std::array

本文关键字:std 添加 array ptr unique      更新时间:2023-10-16

在搜索书籍和在线直到耳朵之间出现剧烈疼痛后,我不知道如何在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));