Namespaces
Variants

std::weak_ptr<T>:: owner_before

From cppreference.net

Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
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 un orden definido por la implementación basado en propietario (en oposición al basado en 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 mediante get() son diferentes (por ejemplo, porque apuntan a diferentes subobjetos dentro del mismo objeto).

Este ordenamiento se utiliza para que los punteros compartidos y débiles puedan usarse como claves en contenedores asociativos, típicamente a través de std::owner_less .

Contenidos

Parámetros

otro - el std::shared_ptr o std::weak_ptr a comparar

Valor de retorno

true si * this precede a other , false en caso 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 que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2083 C++11 owner_before no estaba declarado const declarado const
LWG 2942 C++11 owner_before no estaba declarado noexcept declarado noexcept

Véase también

(C++11)
proporciona ordenación basada en propietario de tipos mixtos para punteros shared y weak
(plantilla de clase)