当使用push_back时,std::unique_ptr是否会移动到std::vector中?

5

我有一个关于如何将std::unique_ptr插入到std::vector中的问题。想象一下,我有一个如下所示的生成对象的函数:

std::unique_ptr<CObject> createObjects()
{
    return std::unique_ptr<CObject> (new CObject());
}

现在在我的代码中,我有一个std::vector<std::unique_ptr<CObjects>> vec,我这样插入元素:

vec.push_back(createObjects());

现在我的问题是:这个unique_ptr是移动到了向量中还是被复制了?

这里更适合使用 emplace_back - user2485710
1
你是指 std::vector<std::unique_ptr<CObject>> 吗? - rodrigo
抱歉!那就是我的意思。我改了它。@user2485710:emplace_back看起来非常有趣,但我不认为我可以在我的应用程序中使用它,因为我有一个模板,它创建从基类继承并返回基类唯一指针的对象。向量存储这些对象。 - Foaly
1个回答

15

unique_ptr不能被复制构造或复制赋值。在向vectorpush_back时,如果它是一个rvalue,它会被移动。要测试这个,您可以尝试推送一个lvalue。这将需要可复制或可分配的unique_ptr,因此会失败:

std::unique_ptr<CObject> p(new CObject());
std::vector<std::unique_ptr<CObject>> vec;
vec.push_back(p); // error!
vec.push_back(std::unique_ptr<CObject>(new CObject())); // OK
vec.push_back(std::move(p)); // OK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接