Пространства имён
Варианты
Действия

std::weak_ptr<T>::weak_ptr

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(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)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
std::weak_ptr
Функции-элементы
Модификаторы
Наблюдатели
Функции, не являющиеся элементами
Вспомогательные классы
Правила вывода(C++17)
 
<tbody> </tbody>
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 std::shared_ptr или std::weak_ptr, которые будут просматриваться этим std::weak_ptr.

Примечание

Поскольку конструктор по умолчанию является constexpr, статические std::weak_ptr инициализируются как часть статической нелокальной инициализации до начала любой динамической нелокальной инициализации. Это делает безопасным использование std::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() внутри области видимости: "
                << 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
(public функция-элемент) [править]