请考虑以下代码:
struct Bar
{
std::shared_ptr<int> MemberFunction()
{
return std::move(m_memberVariable);
}
std::shared_ptr<int> m_memberVariable;
};
是否可以保证来自std::move
的{{1}}实际上会删除成员变量中的引用?或者我应该复制,清除并返回副本以保证此*
显然,在shared_ptr<T>
的情况下,它做了正确的事情(它不可能做到),但标准的保证 unique_ptr<T>
来自std::move
发布它的参考? [当它是成员变量,静态或全球时,本地人因为超出范围而无关紧要]
*可能“交换并返回”优于“复制,清除并返回”。
答案 0 :(得分:17)
你确实有这种保证。从20.7.2.2.1 / 21-22:
shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
效果:移动 - 从
shared_ptr
构建r
实例。后置条件:
*this
应包含旧值r
。r
应为空。r.get() == 0
强>