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

Is a std::unique_ptr moved into a std::vector when using push_back?

提问人:Foaly 提问时间:12/11/2013 最后编辑:honkFoaly 更新时间:7/9/2018 访问量:7008

问:

我有一个关于如何将 a 插入到 .想象一下,我有一个函数,可以生成如下对象:std::unique_ptrstd::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

C++ C++11 向量 stdvector 唯一 ptr

评论

0赞 user2485710 12/11/2013
emplace_back在这里更合适。
1赞 rodrigo 12/11/2013
你是说 ?std::vector<std::unique_ptr<CObject>>
0赞 Foaly 12/11/2013
不好意思!这就是我的意思。我改变了它。@user2485710:看起来非常有趣,但我认为我不能在我的应用程序中使用它,因为我有一个模板,可以创建从基类中提取的对象,并返回指向基类的唯一指针。vector 存储这些。emplace_back

答:

15赞 juanchopanza 12/11/2013 #1

A 不能是复制构造的,也不能是复制分配的。在 a 进入向量的情况下,它被移动,前提是它是一个 rvalue。要测试这一点,您可以尝试推一个左值。这将要求 是可复制或可分配的,因此会失败:unique_ptrpush_backunique_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