std::weak_ptr<T>::owner_before
| template< class Y > bool owner_before( const weak_ptr<Y>& other ) const noexcept; |
||
| template< class Y > bool owner_before( const std::shared_ptr<Y>& other ) const noexcept; |
||
Prüft, ob dieser weak_ptr in der implementierungsdefinierten besitzerbasierten (im Gegensatz zur wertbasierten) Ordnung vor other liegt. Die Ordnung ist so beschaffen, dass zwei intelligente Zeiger nur dann als äquivalent verglichen werden, wenn sie beide leer sind oder wenn sie beide dasselbe Objekt besitzen, auch 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_ptr und weak_ptr als Schlüssel in assoziativen Containern verwenden zu können, typischerweise über 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 liegt, andernfalls false. Gängige Implementierungen vergleichen die Adressen der Steuerblö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] Fehlerberichte
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 2083 | C++11 | owner_before war nicht als const deklariert |
als const deklariert |
| LWG 2942 | 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) |