◐ Shell
clean mode source ↗

std::weak_ptr<T>::weak_ptr — cppreference.com

Материал из cppreference.com

<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 доступна

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