【问题标题】:Is a std::unique_ptr moved into a std::vector when using push_back?使用 push_back 时是否将 std::unique_ptr 移动到 std::vector 中?
【发布时间】:2013-12-10 17:29:30
【问题描述】:

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

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

现在在我的代码中,我有一个 std::vector&lt;std::unique_ptr&lt;CObjects&gt;&gt; vec 并插入如下元素:

vec.push_back(createObjects());

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

【问题讨论】:

  • emplace_back 在这里更合适。
  • 你的意思是std::vector&lt;std::unique_ptr&lt;CObject&gt;&gt;
  • 对不起!这就是我的意思。我改变了它。 @user2485710:emplace_back 看起来很有趣,但我认为我不能在我的应用程序中使用它,因为我有一个模板可以创建从基类继承的对象并返回指向基类的唯一指针。向量存储这些。

标签: c++ c++11 vector stdvector unique-ptr


【解决方案1】:

unique_ptr 不能被复制构造或复制分配。在将push_back 放入向量的情况下,它会被移动,前提是它是一个右值。要对此进行测试,您可以尝试推送 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

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2017-09-21
    • 2011-01-17
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多