# std::weak_ptr<T>::weak_ptr

< cpp‎ | memory‎ | weak ptr

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++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2315 | C++11 | 移动语义未对 `weak_ptr` 启用 | 已启用

### 参阅

operator= | 为`weak_ptr`赋值 (公开成员函数)