C ++:为什么没有weak_ptr有一个shared_ptr&&构造函数?

时间:2017-05-18 04:25:20

标签: c++ c++-standard-library

C ++草案标准mandates weak_ptr的以下构造函数:

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

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

我很惊讶没有看到以下构造函数:

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

当然,const引用到shared_ptr的现有构造函数在rvalue引用版本可以工作的任何上下文中都可以正常工作。但我相信后者允许在调用者希望通过使用shared_ptr rvalue来初始化weak_ptr来破坏性地将共享引用转换为弱引用时保存至少两个原子操作。 p>

1 个答案:

答案 0 :(得分:4)

weak_ptr<>拥有指向由shared_ptr<>管理的对象的非拥有指针。删除对该对象的最后一个shared_ptr<>引用时删除该对象。

如果您遗漏的构造函数存在,则可能会传递最后一个现有的shared_ptr<>参数,这会在移动过程中破坏对象。因此,您将留下指向已删除对象的weak_ptr<>

没有多大意义,对吧?