Является ли перемещенный из shared_ptr гарантированным опорожнение?

Рассмотрим следующий код:

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

    std::shared_ptr<int> m_memberVariable;
};

Гарантируется ли, что std::move от a shared_ptr<T> фактически удалит ссылку в переменной-члене? Или я должен копировать, очищать и возвращать копию, чтобы гарантировать это *

Очевидно, что в случае unique_ptr<T> он делает правильную вещь (этого не может не сделать), но гарантирует ли стандарт, что std::move d из shared_ptr освобождает ссылку? [когда это переменная-член, статическая или глобальная, locals не имеют значения, поскольку они выходят за рамки]

* возможно, "swap and return" лучше, чем "копировать, очищать и возвращать".

Ответы

Ответ 1

У вас действительно есть эта гарантия. Из 20.7.2.2.1/21-22:

shared_ptr(shared_ptr&& r) noexcept;

template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;

Эффекты: Move-constructs a shared_ptr экземпляр из r.

Постусловия: *this должно содержать старое значение r. r должен быть пустым. r.get() == 0.