std::weak_ptr<T>::weak_ptr — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
|
|
(1) | (начиная с C++11) |
|
|
(2) | (начиная с C++11) |
|
|
(2) | (начиная с C++11) |
|
|
(2) | (начиная с C++11) |
|
|
(3) | (начиная с C++11) |
|
|
(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
|
доступна |