Namespaces
Variants

std::weak_ptr<T>:: weak_ptr

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until 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)

Создает новый weak_ptr , который потенциально разделяет объект с r .

1) Конструктор по умолчанию. Создает пустой weak_ptr .
2) Создает новый weak_ptr , который разделяет объект, управляемый r . Если r не управляет объектом, * this также не управляет объектом. Шаблонные перегрузки не участвуют в разрешении перегрузки, если только Y* не является неявно преобразуемым в T* , или Y является типом "массив из N U " для некоторого типа U и некоторого числа N , и T является типом "массив неизвестной границы из (возможно cv-квалифицированного) U " (начиная с C++17) .
3) Конструкторы перемещения. Перемещает экземпляр weak_ptr из r в * this . После этого r становится пустым и r. use_count ( ) == 0 . Шаблонная перегрузка не участвует в разрешении перегрузки, если Y* не является неявно преобразуемым в T* .

Содержание

Параметры

r - a std::shared_ptr or std::weak_ptr that will be viewed by this 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++.

DR Applied to Behavior as published Correct behavior
LWG 2315 C++11 move semantic was not enabled for weak_ptr enabled

Смотрите также

присваивает weak_ptr
(публичная функция-член)