2011-08-18 55 views
3

這是而不是關於將std :: auto_ptr放入std :: vector的問題。嚴格所有權語義的C++向量

std::std::tr1::boost::中是否有某個載體相當於std::auto_ptr?我在函數參數中使用了std::auto_ptr,並使用返回值來取消這些函數的所有權語義。但是這樣我就只能傳遞單個對象。作爲載體的臨時解決方案,我有這樣的:

std::auto_ptr<std::vector<std::tr1::shared_ptr<ClassExample> > > fx(....); 

我想其中,通過引入升壓,我將能夠變成這樣:

std::auto_ptr<std::vectro<boost::unique_ptr<ClassExample> > >f(...); 

爲了定義嚴格所有權傳球,但它似乎相當複雜。爲了簡化它,我可以使用

std::vector<boost::unique_ptr<ClassExample> > f(...); 

的價格爲載體的深拷貝不高,但我還是好奇,如果有東西,我可以用這樣的:

auto_vector<ClassExample> f(...); 

這意味着該函數釋放所有對象的所有權,並且矢量內部數據數組不會被深度複製。

+1

我認爲這是「如果每個人都想要一個」的問題之一。如果'auto_vector',那麼爲什麼不'auto_deque','auto_set','shared_vector','unique_unordered_multiset',基本上是任何智能指針類型與任何類的每個組合。模板語法是羅嗦的,typedefs可以幫助解決這個問題,但通常是用戶的問題。這甚至忽略了你希望'auto_vector '專門包含'unique_ptr'而不是其他任何東西。 –

+0

喬Gauterin:謝謝,固定 –

+0

我認爲你有幾個假設錯誤,特別是大多數編譯器將能夠優化利用價值的迴歸不要求一個新的對象,載體本身的所以動態分配是不必要的併發症,以問題。 –

回答

3

沒有什麼特別的原因,爲什麼你需要保持指針的向量,第一個解決辦法是拋棄所有的複雜性和去簡單:對象的

std::vector<Type> f(); 

所有權是獨特(該矢量擁有它們),而代碼看起來像,它在複製矢量時返回,在大多數情況下它將是optimized away

如果需要載體內的對象進行動態分配,由於一些其他的要求(對象必須通過工廠分配的,它們是指向派生類型,或者他們不能移動由於載體的增長 - - 代碼保持引用/指針),你沒有顯示,那麼我會去一個boost::ptr_vector,將保持所含對象的所有權。再次,價值回報:

boost::ptr_vector<Type> f(); 
4

有一個C++ 11解決方案 - 它需要一個提供r值引用的實現,並且有一個標準庫更新以包含移動構造函數和std::unique_ptr

只是返回std::vector<std::unique_ptr<T>> - 該類型不能被複制,因爲std::unique_ptr<T>是不可複製的。編譯器將在返回時使用移動構造函數,它不會調用深層副本,或者將應用RVO並且不再構建新對象。

+0

對於這個問題,一個'std :: vector &&'也可以移動! –

+0

大概他是存儲基類指針或者有另一個存儲指針而不是價值的原因。 –

+0

我非常懷疑返回一個引用(可能是一個局部變量)將是一個好主意。 AFAIK,你按照價值回報,如果複製elision是合法的,那麼編譯器會選擇移動。 – UncleBens