查看 boost 版本为 1.53 的 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));
std::weak_ptr为什么不提供移动功能?有没有充分的理由?如果没有,那么应该将weak_ptr视为可移动类型吗?