std::weak_ptr<T>::weak_ptr - cppreference.com
来自cppreference.com
constexpr weak_ptr() noexcept; |
(1) | (C++11 起) |
weak_ptr( const weak_ptr& r ) noexcept; |
(2) | (C++11 起) (C++26 起为 constexpr) |
template< class Y > weak_ptr( const weak_ptr<Y>& r ) noexcept; |
(3) | (C++11 起) (C++26 起为 constexpr) |
template< class Y > weak_ptr( const std::shared_ptr<Y>& r ) noexcept; |
(4) | (C++11 起) (C++26 起为 constexpr) |
weak_ptr( weak_ptr&& r ) noexcept; |
(5) | (C++11 起) (C++26 起为 constexpr) |
template< class Y > weak_ptr( weak_ptr<Y>&& r ) noexcept; |
(6) | (C++11 起) (C++26 起为 constexpr) |
构造潜在地与 r 共享对象的新 weak_ptr。
1) 默认构造函数。构造空 weak_ptr。
2-4) 构造新的 weak_ptr,它共享 r 所管理的对象。r 不管理对象的情况下 *this 也不会管理对象。
3,4) 这些重载只有在 Y* 可隐式转换到 T*,或 Y 是某类型 U 和某数 N 的“N 个 U 的数组”类型,且 T 是“(可有 cv 限定的)U 的未知边界数组”类型(C++17 起)时才会参与重载决议。
5,6) 移动构造函数。从 r 移动 weak_ptr 实例到 *this。之后,r 为空且 r.use_count()==0。
6) 此重载只有在 Y* 可隐式转换到 T* 时才会参与重载决议。
参数
| r | - | 将为此 std::weak_ptr 所查看的 std::shared_ptr 或 std::weak_ptr |
注解
constexpr 构造函数确保了,静态 weak_ptr 的初始化是在任何动态非局部初始化之前,作为静态非局部初始化的一部分进行的。这使得在任何静态对象的构造函数中使用 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():" << w_ptr.use_count() << '\n'; } std::cout << "作用域外的 w_ptr.use_count():" << w_ptr.use_count() << '\n'; std::cout << "作用域外的 w_ptr.expired():" << std::boolalpha << w_ptr.expired() << '\n'; }
输出:
作用域内的 w_ptr.use_count():1 作用域外的 w_ptr.use_count():0 作用域外的 w_ptr.expired():true
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2315 | C++11 | 移动语义未对 weak_ptr 启用
|
已启用 |