Namespaces
Variants

std::shared_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 shared_ptr < Y > & other ) const noexcept ;
template < class Y >
bool owner_before ( const std:: weak_ptr < Y > & other ) const noexcept ;

Comprueba si este shared_ptr precede a other en un orden definido por la implementación basado en propietario (en oposición a 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 2873 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)