Namensräume
Varianten
Aktionen

std::shared_ptr<T>::owner_before

Von cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
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 in der Implementierungs-definierten besitzerbasierten (im Gegensatz zur wertbasierten) Reihenfolge vor other kommt. Die Reihenfolge ist so, dass zwei intelligente Zeiger nur dann als äquivalent verglichen werden, wenn sie beide leer sind oder wenn sie dasselbe Objekt besitzen, auch wenn die Werte der durch get() erhaltenen Zeiger unterschiedlich sind (z.B. weil sie auf verschiedene Unterobjekte innerhalb desselben Objekts zeigen).

Diese Ordnung wird verwendet, um `shared_ptr` und `weak_ptr` als Schlüssel in assoziativen Containern verwendbar zu machen, typischerweise durch std::owner_less.

Inhalt

[bearbeiten] Parameter

Sonstiges - der zu vergleichende std::shared_ptr oder std::weak_ptr

[bearbeiten] Rückgabewert

true, wenn *this vor other kommt, false andernfalls. Gängige Implementierungen vergleichen die Adressen der Kontrollblöcke.

[bearbeiten] 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' // won't compile 
//            << "w3 < w2 " << (w3 < w2) << '\n' // won't compile
              << "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

[bearbeiten] Defect reports

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

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

[bearbeiten] Siehe auch

ermöglicht gemischttypige, besitzerbasierte Ordnung von Shared- und Weak-Zeigern
(Klassen-Template) [edit]