Namensräume
Varianten
Aktionen

std::weak_ptr<T>::owner_before

Von cppreference.com
< cpp‎ | memory‎ | weak 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 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

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