0
    vector<Universe*> vtd;
    Sweet* ptr = new Sweet();
    vtd.push_back(ptr); <--- WORKS FINE!

    vector<unique_ptr<Universe>> vtd;
    unique_ptr<Sweet> X (new Sweet());
    vtd.push_back(X); <--- Intellsense error!

为什么简单地用 unique_ptr 替换原始指针在这种情况下不起作用?

宇宙是一类,

Sweet:Univers 是派生类

4

2 回答 2

2

背后的原因std::unique_ptr是在任何给定时间只能有一个指针的所有者,考虑到这一点,我们可以很容易地找出 astd::unique_ptr不可复制。

std::vector::push_back通常会复制它的参数然后存储这个副本,但是由于我们不能复制 astd::unique_ptr它会失败,除非我们采取一些行动。

要将 a 存储std::unique_ptr在 a 中,std::vector我们需要std::move将所有权放入向量中,使我们拥有的那个无效。


std::vector<std::unique_ptr<Obj>> vec;

std::unique_ptr<Obj> my_ptr (new Obj);

vec.push_back (std::move (my_ptr)); /* `vec` now owns the pointer,
                                       my_ptr points to nothing    */
于 2013-07-27T16:19:36.197 回答
0

尝试vtd.push_back(std::move(X))

于 2013-07-27T16:18:43.710 回答