2013-07-27 48 views
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替換raw poiner無法在這種情況下工作?原始指針在矢量中工作<T>而unique_prt不

宇宙是一個類,

甜:UNIVERS被派生類

回答

2

背後std::unique_ptr的原因是,只能有指針的一個所有者在任何給定時間,以考慮到這一點,我們很容易發現std::unique_ptr不可複製。

std::vector::push_back通常會複製它的參數然後將此副本保存起來,但由於我們無法複製std::unique_ptr,所以它會失敗,除非我們採取一些措施。

要在std::vector中存儲std::unique_ptr,我們需要將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 */ 
+0

謝謝!我不明白它爲什麼失敗 – user2426290

0

嘗試vtd.push_back(std::move(X))

+0

謝謝你,那確實起作用。我會去谷歌更多關於移動運營商,以明確爲什麼做這項工作。 – user2426290