2013-04-16 47 views
2

通過boost的1.53頭文件來查看weak_ptr,我驚訝地發現即使它們沒有記錄,移動賦值和移動構造函數也被實現了。從這個documentation,std :: weak_ptr沒有任何要求提供移動功能。爲什麼std :: weak_ptr沒有移動構造函數或移動賦值操作符?

通過Visual Studio 2012的實現了weak_ptr的展望,我沒有注意到在weak_ptr的聲明的任何明顯的移動操作,儘管他們可能繼承的背後隱藏。但是,此代碼的結果在監視窗口中報告一個共享的參考和指針兩個弱引用,這使我相信了weak_ptr是不動啓用:

std::shared_ptr<int> ptr(std::make_shared<int>(5)); 
std::weak_ptr<int> weakptr(ptr); 
std::weak_ptr<int> movedWeakPtr(std::move(weakptr)); 

是否有一個很好的理由,性病:: weak_ptr不提供移動功能?如果不是,那麼weak_ptr應該被視爲可移動類型嗎?

回答

5

每個可複製的類型是定義可移動。 weak_ptr是可複製的,因此它是可移動的。

weak_ptr可能肯定有移動構造函數。但這只是一個相對較小的優化。這可能是一個標準委員會的監督。

+2

注意,在C++ 14的weak_ptr * *不具有移動構造函數§20.8.2.3.1 [util.smartptr.weak] –

相關問題