Является ли перемещенный из 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
.