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