std::weak_ptr<T>::weak_ptr

来自cppreference.com
< cpp‎ | memory‎ | weak ptr
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集器支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)



 
 
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 是某类型 U 和某数 N 的“NU 的数组”类型,且 T 是“(可有 cv 限定的)U 的未知边界数组”类型 (C++17 起),否则模板化重载不参与重载决议。
3) 移动构造函数。从 r 移动 weak_ptr 实例到 *this。之后,r 为空且 r.use_count()==0。除非 Y* 可隐式转换为 T*,否则模板重载不参与重载决议。

参数

r - 将为此 std::weak_ptr 所查看的 std::shared_ptrstd::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 启用 已启用

参阅

weak_ptr 赋值
(公开成员函数)