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>
答案 0 :(得分:4)
weak_ptr<>
拥有指向由shared_ptr<>
管理的对象的非拥有指针。删除对该对象的最后一个shared_ptr<>
引用时删除该对象。
如果您遗漏的构造函数存在,则可能会传递最后一个现有的shared_ptr<>
参数,这会在移动过程中破坏对象。因此,您将留下指向已删除对象的weak_ptr<>
。
没有多大意义,对吧?