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; |
||
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
| (C++11) |
ermöglicht gemischttypige, besitzerbasierte Ordnung von Shared- und Weak-Zeigern (Klassen-Template) |