Espacios de nombres
Variantes

std::weak_ptr::owner_before

De cppreference.com
 
 
Biblioteca de servicios
Apoyo del lenguaje
Apoyo de tipos (tipos básicos, RTTI)
Macros de prueba de característica de la biblioteca (C++20)
Servicios de programa
Funciones variádicas
Apoyo de corrutinas (C++20)
Apoyo de contratos (C++26)
Comparación de tres vías (C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
 
template< class Y > 
bool owner_before( const weak_ptr<Y>& other ) const noexcept;
template< class Y >
bool owner_before( const std::shared_ptr<Y>& other ) const noexcept;

Comprueba si este weak_ptr precede a other en el orden basado en el propietario definido por la implementación (a diferencia del basado en el valor). El orden es tal que dos punteros inteligentes se comparan equivalentes solo si ambos están vacíos o si ambos poseen el mismo objeto, incluso si los valores de los punteros obtenidos por get() son diferentes (por ejemplo, porque apuntan a diferentes subobjetos dentro del mismo objeto)

Este orden se usa para hacer que los punteros débiles y compartidos se puedan usar como claves en contenedores asociativos, generalmente a través de std::owner_less.

Parámetros

other - El std::shared_ptr o std::weak_ptr a comparar.

Valor de retorno

true si *this precede a other, false de lo contrario. Las implementaciones comunes comparan las direcciones de los bloques de control.

Ejemplo

#include <iostream>
#include <memory>
 
struct Foo {
    int n1;
    int n2; 
    Foo(int a, int b) : n1(a), n2(b) {}
};
int main()
{   
    auto p1 = std::make_shared<Foo>(1, 2);
    std::shared_ptr<int> p2(p1, &p1->n1);
    std::shared_ptr<int> p3(p1, &p1->n2);

    std::cout << std::boolalpha
              << "p2 < p3 " << (p2 < p3) << '\n'
              << "p3 < p2 " << (p3 < p2) << '\n'
              << "p2.owner_before(p3) " << p2.owner_before(p3) << '\n'
              << "p3.owner_before(p2) " << p3.owner_before(p2) << '\n';

    std::weak_ptr<int> w2(p2);
    std::weak_ptr<int> w3(p3);
    std::cout 
//              << "w2 < w3 " << (w2 < w3) << '\n'  // no compilará 
//              << "w3 < w2 " << (w3 < w2) << '\n'  // no compilará
              << "w2.owner_before(w3) " << w2.owner_before(w3) << '\n'
              << "w3.owner_before(w2) " << w3.owner_before(w2) << '\n';

}

Salida:

p2 < p3 true
p3 < p2 false
p2.owner_before(p3) false
p3.owner_before(p2) false
w2.owner_before(w3) false
w3.owner_before(w2) false

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 2873 C++11 owner_before podría no estar declarado noexcept. Se declara noexcept.
LWG 2942 C++11 weak_ptr::owner_before se omitió en la resolución de LWG 2873. Se hizo noexcept.

Véase también

Proporciona un orden de tipo mixto basado en propietario de los punteros compartidos y débiles.
(plantilla de clase) [editar]
Morty Proxy This is a proxified and sanitized view of the page, visit original site.