std::shared_ptr<T>:: owner_before
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
(C++17)
|
||||
|
(
until C++20*
)
|
||||
|
shared_ptr::owner_before
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
|
(until C++20)
(until C++20)
(until C++20)
(until C++20)
(until C++20)
(C++20)
|
||||
|
functions
(
until C++26*
)
|
||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
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
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) |