2015-07-10 25 views
0

我有一個函數,它是像的push_back(移動(struct.unique_ptr))導致編譯錯誤

for (auto&& i : v) { 
    ... 
    this->fifoQueue.push_back(move(i.p)); 
    ... 
} 

其中fifoQueuevector<unique_ptr<T> >類型的,vvector<struct s>型的,並且是struct s

struct s { 
    ... 
    std::unique_ptr<T> p; 
    ... 
}; 

語句this->fifoQueue.push_back(move(i.p));已導致編譯器錯誤「... error: declared here unique_ptr(const unique_ptr&) = delete; ...」。這個聲明有什麼問題?

我有另外一份工作聲明基本上與它相同,只不過聲明就像this->fifoQueue.push_back(move(p))。那麼i.p是邪惡的?或auto&&


更新:

作爲彼得推斷,v確實是const參考,這導致錯誤。

+1

[MCVE](http://stackoverflow.com/help/mcve)please ... –

+5

您確定第一個代碼中的「v」不是「const」嗎?而且'i.p'可以變成'const'還有其他地方嗎? – Petr

+0

只是好奇,那麼'this-> fifoQueue.push_back(move(i).p)'? – fredoverflow

回答

3

(擴大我的評論)

你的錯誤信息,unique_ptr(const unique_ptr&),似乎表明i.p成爲const,從而push_back必須做出它的拷貝(或者實際上甚至std::move必須做出它的拷貝,見this answer)。但是,unique_ptr不能被構建爲const unique_ptr&的副本,因爲考慮到unique_ptr的性質,這是絕對沒有意義的。所以你應該看看它從哪裏變成const

我認爲const最可能的來源是v,因爲您沒有向我們展示過該聲明。

0

如上所述,似乎編譯器想要複製你的結構。因爲這個unique_ptr裏面不行。

當您考慮它時,gues是什麼意思auto在這裏?這將是yourStruct &yourStruct,因爲你實際上可以修改這個vector內的結構。由於reference collapsing,您從auto &&得到yourStruct &

總而言之,與其考慮如何通過push_back來避免這種情況,只需使用emplace_back即可在向量中執行構造。

相關問題