在查看std::weak_ptr::operator=
on cppreference时,我意识到我不明白过载的解释(1-3)是什么意思。也就是说,它表示
template< class Y >
weak_ptr& operator=( const shared_ptr<Y>& r ) noexcept;
等同于
std::weak_ptr<T>(r).swap(*this)
怎么会这样?不是std::weak_ptr<T>(r)
一个右值(一个临时的),而.swap(*this)
是指它的实例,即与它自己交换?我以为它应该是
std::weak_ptr<T>().swap(r)
这到底发生了什么?
答案 0 :(得分:1)
std::weak_ptr<T>(r)
创建一个临时weak_ptr
,指向与r
相同的对象;
.swap(*this)
将临时值与当前实例进行交换,使当前实例指向与r
相同的对象,并指向当前实例所用的临时值;
;
销毁临时文件,因此现在有一个weak_ptr
指向当前实例用来指向的对象。