std :: weak_ptr :: operator = confusion

时间:2018-01-12 06:13:45

标签: c++ c++11 smart-pointers swap

在查看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)

这到底发生了什么?

1 个答案:

答案 0 :(得分:1)

std::weak_ptr<T>(r)

创建一个临时weak_ptr,指向与r相同的对象;

.swap(*this)

将临时值与当前实例进行交换,使当前实例指向与r相同的对象,并指向当前实例所用的临时值;

;

销毁临时文件,因此现在有一个weak_ptr指向当前实例用来指向的对象。