为什么std::weak_ptr没有move构造函数或move赋值操作符?

Why does std::weak_ptr not have a move constructor or move assignment operator?

本文关键字:move 构造函数 赋值操作符 ptr std weak 为什么 没有      更新时间:2023-10-16

查看boost 1.53的weak_ptr头文件,我惊讶地发现move赋值和move构造函数被实现了,尽管它们没有文档化。从本文档来看,std::weak_ptr不需要提供移动功能。

通过Visual Studio 2012的weak_ptr实现,我没有注意到在weak_ptr中声明任何明显的移动操作,尽管它们可能隐藏在继承之后。然而,这段代码导致监视窗口报告指针的一个共享引用和两个弱引用,这使我相信weak_ptr没有启用move:

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视为可移动类型吗?

每一个可复制的类型都是根据定义可移动的。weak_ptr是可复制的,因此是可移动的。

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