std::weak_ptr<T>:: weak_ptr
From cppreference.net
C++
Memory management library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::weak_ptr
| Member functions | ||||
|
weak_ptr::weak_ptr
|
||||
| Modifiers | ||||
| Observers | ||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
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 起) |
构造一个可能与
r
共享对象的新
weak_ptr
。
1)
默认构造函数。构造空的
weak_ptr
。
2)
构造新的
weak_ptr
,该指针共享由
r
管理的对象。若
r
未管理任何对象,则
*
this
同样不管理任何对象。模板化重载仅当
Y*
可隐式转换为
T*
时参与重载决议
,或当
Y
为“
N
个
U
类型元素的数组”而
T
为“(可能带 cv 限定符的)
U
类型未知边界数组”时
(C++17 起)
。
3)
移动构造函数。将 weak_ptr 实例从
r
移动到
*
this
。此后,
r
变为空且
r.
use_count
(
)
==
0
。模板化重载不参与重载决议,除非
Y*
可隐式转换为
T*
。
目录 |
参数
| r | - | 将被此 std::weak_ptr 观察的 std::shared_ptr 或 std::weak_ptr |
注释
由于默认构造函数是
constexpr
的,静态
std::weak_ptr
会作为
静态非局部初始化
的一部分进行初始化,该过程在任何动态非局部初始化开始之前执行。这使得在任何静态对象的构造函数中使用
std::weak_ptr
都是安全的。
示例
运行此代码
#include <iostream> #include <memory> 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
(公开成员函数) |