std::weak_ptr<T>::weak_ptr
// 1)
constexpr weak_ptr() noexcept;
// 2)
weak_ptr( const weak_ptr& r ) noexcept;
template< class Y >
weak_ptr( const weak_ptr<Y>& r ) noexcept;
template< class Y >
weak_ptr( const std::shared_ptr<Y>& r ) noexcept;
// 3)
weak_ptr( weak_ptr&& r ) noexcept;
template< class Y >
weak_ptr( weak_ptr<Y>&& r ) noexcept;
构造新的 weak_ptr,它可能与 r
共享一个对象。
默认构造函数。构造空的 weak_ptr。
构造新的 weak_ptr,它共享由 r
管理的对象。如果 r
不管理任何对象,*this
也不管理任何对象。除非 Y*
可隐式转换为 T*
,否则模板重载不参与重载解析,
或者 Y 是类型“N 个 U 的数组”,其中 U 是某种类型,N 是某个数字,而 T 是类型“未知边界的数组(可能 cv 限定的)U”。**(自 C++17 起)
移动构造函数。将 r
的 weak_ptr 实例移动到 *this
。之后,r
为空且 r.use_count()==0
。除非 Y*
可隐式转换为 T*
,否则模板重载不参与重载解析。
参数
r
- 一个 std::shared_ptr 或 std::weak_ptr,将被此 std::weak_ptr 查看。
备注
由于默认构造函数是 constexpr 的,静态 std::weak_ptr 在静态非局部初始化的一部分被初始化,早于任何动态非局部初始化开始。这使得在任何静态对象的构造函数中使用 std::weak_ptr 是安全的。
示例
#include <memory>
#include <iostream>
struct Foo {};
int main()
{
std::weak_ptr<Foo> w_ptr;
{
auto ptr = std::make_shared<Foo>();
w_ptr = ptr;
std::cout
<< "w_ptr.use_count() inside scope: "
<< w_ptr.use_count() << '\n';
}
std::cout
<< "w_ptr.use_count() out of scope: "
<< w_ptr.use_count() << '\n';
std::cout
<< "w_ptr.expired() out of scope: "
<< std::boolalpha << w_ptr.expired() << '\n';
}
w_ptr.use_count() inside scope: 1
w_ptr.use_count() out of scope: 0
w_ptr.expired() out of scope: true
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 2315 | C++11 | weak_ptr 没有启用移动语义 | 已启用 |