3

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

4

1 回答 1

6

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

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

于 2013-04-16T04:20:48.353 回答