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

Mik*_*ine 14 c++ move shared-ptr c++11

请考虑以下代码:

struct Bar
{
    std::shared_ptr<int> MemberFunction()
    {
        return std::move(m_memberVariable);
    }

    std::shared_ptr<int> m_memberVariable;
};
Run Code Online (Sandbox Code Playgroud)

是否保证std::movefrom a shared_ptr<T>将实际删除成员变量中的引用?或者我应该复制,清除并返回副本以保证*

显然,在的情况下,unique_ptr<T>它确实是正确的(它也不可能这样做),但不标准的保证,一个std::move从d shared_ptr版本的参考?[当它是成员变量,静态或全局时,本地人无关紧要,因为它们超出范围]

*可能"交换和返回"比"复制,清除和返回"更好.

Ker*_* SB 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.