std::shared_ptr<T>::owner_before
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 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.
|
Véase también
(C++11) |
Proporciona un orden de tipo mixto basado en propietario de los punteros compartidos y débiles. (plantilla de clase) |