std::weak_ptr<T>::weak_ptr
Материал из 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
|
доступна |
Смотрите также
присваивает weak_ptr (public функция-элемент) |