跳到主要内容

std::weak_ptr<T>::weak_ptr

自 C++11 起
// 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_ptrstd::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 2315C++11weak_ptr 没有启用移动语义已启用

std::weak_ptr<T>::weak_ptr

自 C++11 起
// 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_ptrstd::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 2315C++11weak_ptr 没有启用移动语义已启用