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 ;
**Note:** Le contenu a été préservé tel quel car : - Toutes les balises HTML et attributs ont été conservés sans modification - Le texte à l'intérieur des balises ` ` (qui fonctionnent comme des balises ` `) n'a pas été traduit - Les termes spécifiques au C++ (comme `template`, `class`, `bool`, `const`, `noexcept`, `shared_ptr`, `weak_ptr`, etc.) ont été conservés dans leur forme originale - La structure et le formatage du tableau HTML sont restés identiques

Vérifie si ce shared_ptr précède other dans l'ordre défini par l'implémentation basé sur le propriétaire (par opposition à l'ordre basé sur la valeur). L'ordre est tel que deux pointeurs intelligents sont équivalents uniquement s'ils sont tous deux vides ou s'ils possèdent le même objet, même si les valeurs des pointeurs obtenues par get() sont différentes (par exemple parce qu'ils pointent vers différents sous-objets du même objet).

Cet ordonnancement est utilisé pour permettre aux pointeurs partagés et faibles d'être utilisés comme clés dans les conteneurs associatifs, généralement via std::owner_less .

Table des matières

Paramètres

autre - le std::shared_ptr ou std::weak_ptr à comparer

Valeur de retour

true si * this précède other , false sinon. Les implémentations courantes comparent les adresses des blocs de contrôle.

Exemple

#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' // ne compilera pas
//            << "w3 < w2 " << (w3 < w2) << '\n' // ne compilera pas
              << "w2.owner_before(w3) " << w2.owner_before(w3) << '\n'
              << "w3.owner_before(w2) " << w3.owner_before(w2) << '\n';
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement publié Comportement corrigé
LWG 2873 C++11 owner_before n'était pas déclaré noexcept déclaré noexcept

Voir aussi

(C++11)
fournit un ordonnancement basé sur le propriétaire de types mixtes pour les pointeurs partagés et faibles
(modèle de classe)