std::weak_ptr::weak_ptr
De cppreference.com
<tbody>
</tbody>
constexpr weak_ptr() noexcept; |
(1) | (desde C++11) |
weak_ptr( const weak_ptr& r ) noexcept; |
(2) | (desde C++11) |
template< class Y > weak_ptr( const weak_ptr<Y>& r ) noexcept; |
(2) | (desde C++11) |
template< class Y > weak_ptr( const std::shared_ptr<Y>& r ) noexcept; |
(2) | (desde C++11) |
weak_ptr( weak_ptr&& r ) noexcept; |
(3) | (desde C++11) |
template< class Y > weak_ptr( weak_ptr<Y>&& r ) noexcept; |
(3) | (desde C++11) |
Construye un nuevo weak_ptr que potencialmente comparte un objeto con r.
1) Constructor por defecto. Construye un
weak_ptr vacío.2) Construye un nuevo
weak_ptr que comparte un objeto gestionado por r. Si r no gestiona ningún objeto, *this tampoco gestiona ningún objeto. Las sobrecargas de plantilla no participan en la resolución de sobrecarga a menos que Y* sea convertible implícitamente a T*, o Y sea de tipo "array de N U" para algún tipo U y algún número N, y T sea de tipo "array de límite desconocido de U (posiblemente calificado-cv)" (desde C++17).3) Constructores de movimiento. Mueve una instancia de
weak_ptr de r a *this. Después de esto, r está vacío y r.use_count()==0. La sobrecarga de plantilla no participa en la resolución de sobrecarga a menos que Y* sea convertible implícitamente a T*.Parámetros
| r | - | Un std::shared_ptr o std::weak_ptr que se observará por este std::weak_ptr. |
Notas
Dado que el constructor predeterminado es constexpr, los std::weak_ptr estáticos se inicializan como parte de la inicialización estática no local, antes de que comience cualquier inicialización dinámica no local. Esto hace que sea seguro usar std::weak_ptr en un constructor de cualquier objeto estático.
Ejemplo
Ejecuta este código
#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() dentro del ámbito: " << w_ptr.use_count() << '\n';
}
std::cout << "w_ptr.use_count() fuera del ámbito: " << w_ptr.use_count() << '\n';
std::cout << "w_ptr.expired() fuera del ámbito: " << std::boolalpha << w_ptr.expired() << '\n';
}
Salida:
w_ptr.use_count() dentro del ámbito: 1
w_ptr.use_count() fuera del ámbito: 0
w_ptr.expired() fuera del ámbito: true
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2315 | C++11 | La semántica de movimiento no estaba habilitada para weak_ptr.
|
Se habilitó. |
Véase también
Asigna el weak_ptr. (función miembro pública) |