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

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

1个回答

7
每一种可复制的类型都“在定义上”是可移动的。weak_ptr是可复制的,因此它是可移动的。 weak_ptr可能有一个移动构造函数,当然,这只是为了相对不重要的优化而已。这可能是标准委员会的疏忽。

3
请注意,在C++14中,weak_ptr确实具有移动构造函数§ 20.8.2.3.1 [util.smartptr.weak]。 - Chris Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接