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應該被視爲可移動類型嗎?
注意,在C++ 14的weak_ptr * *不具有移動構造函數§20.8.2.3.1 [util.smartptr.weak] –