为什么std :: weak_ptr没有移动构造函数或移动赋值运算符?

时间:2013-04-16 03:58:59

标签: c++ visual-c++ visual-studio-2012 c++11 move-semantics

通过boost的针对weak_ptr的1.53标题,我惊讶地发现移动赋值和移动构造函数已经实现,即使它们没有记录。从这个documentation开始,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));

有没有充分的理由说std :: weak_ptr不提供移动功能?如果不是,应将weak_ptr视为可移动类型吗?

1 个答案:

答案 0 :(得分:6)

每个可复制的类型都是按照定义可移动。 weak_ptr是可复制的,因此它是可移动的。

weak_ptr 当然可以拥有移动构造函数。但它只适用于相对较小的优化。这可能是标准委员会的疏忽。