移动的shared_ptr是否保证被清空?

时间:2013-06-17 13:13:11

标签: c++ c++11 move shared-ptr

请考虑以下代码:

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发布它的参考? [当它是成员变量静态全球时,本地人因为超出范围而无关紧要]

*可能“交换并返回”优于“复制,清除并返回”。

1 个答案:

答案 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