std::weak_ptr<T>::weak_ptr
来自cppreference.com
constexpr weak_ptr() noexcept; |
(1) | (C++11 起) |
weak_ptr( const weak_ptr& r ) noexcept; |
(2) | (C++11 起) |
template< class Y > weak_ptr( const weak_ptr<Y>& r ) noexcept; |
(2) | (C++11 起) |
template< class Y > weak_ptr( const std::shared_ptr<Y>& r ) noexcept; |
(2) | (C++11 起) |
weak_ptr( weak_ptr&& r ) noexcept; |
(3) | (C++11 起) |
template< class Y > weak_ptr( weak_ptr<Y>&& r ) noexcept; |
(3) | (C++11 起) |
构造新的 weak_ptr
,潜在地与 r
共享对象的。
1) 默认构造函数。构造空
weak_ptr
。2) 构造新的
weak_ptr
,它共享 r
所管理的对象。若 r
不管理对象,则 *this 亦不管理对象。模板重载不参与重载决议,除非 Y*
可隐式转换为 T*
,或 Y
是某类型 U
和某数 N
的“ N
个 U
的数组”类型,而 T
是“(可有 cv 限定的) U
的未知边界数组”类型 (C++17 起)。3) 移动构造函数。从
r
移动 weak_ptr 实例到 *this
。之后, r
为空且 r.use_count()==0 。模板重载不参与重载决议,除非 Y*
可隐式转换为 T*
。参数
r | - | 将为此 std::weak_ptr 所查看的 std::shared_ptr 或 std::weak_ptr |
注解
因为默认构造函数是 constexpr
,静态 weak_ptr
会在任何动态非局部初始化之前,作为静态非局部初始化的一部分初始化。这使得在任何静态对象的构造函数中使用 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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2315 | C++11 | 移动语义未对 weak_ptr 启用
|
已启用 |
参阅
为weak_ptr 赋值 (公开成员函数) |