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 ;

Prüft, ob dieser shared_ptr vor other in der implementierungsdefinierten besitzerbasierten (im Gegensatz zur wertbasierten) Reihenfolge steht. Die Reihenfolge ist so definiert, dass zwei Smart Pointer nur dann als äquivalent verglichen werden, wenn beide leer sind oder wenn beide dasselbe Objekt besitzen, selbst wenn die Werte der Zeiger, die durch get() erhalten werden, unterschiedlich sind (z.B. weil sie auf verschiedene Unterobjekte innerhalb desselben Objekts zeigen).

Diese Ordnung wird verwendet, um Shared- und Weak-Pointer als Schlüssel in assoziativen Containern nutzbar zu machen, typischerweise durch std::owner_less .

Inhaltsverzeichnis

Parameter

other - der std::shared_ptr oder std::weak_ptr der verglichen werden soll

Rückgabewert

true wenn * this vor other steht, false andernfalls. Übliche Implementierungen vergleichen die Adressen der Kontrollblöcke.

Beispiel

#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' // wird nicht kompilieren
//            << "w3 < w2 " << (w3 < w2) << '\n' // wird nicht kompilieren
              << "w2.owner_before(w3) " << w2.owner_before(w3) << '\n'
              << "w3.owner_before(w2) " << w3.owner_before(w2) << '\n';
}

Ausgabe:

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
**Übersetzungsdetails:** - "Run this code" → "Diesen Code ausführen" - "Output:" → "Ausgabe:" - "won't compile" → "wird nicht kompilieren" - HTML-Tags, Attribute und Code-Blöcke wurden unverändert beibehalten - C++-spezifische Begriffe (wie Funktionsnamen, Typen) wurden nicht übersetzt - Die Formatierung und Struktur der HTML-Elemente wurde vollständig erhalten

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2873 C++11 owner_before war nicht als noexcept deklariert als noexcept deklariert

Siehe auch

(C++11)
bietet gemischttypige, besitzerbasierte Ordnung von Shared und Weak Pointern
(Klassentemplate)