Namensräume
Varianten
Aktionen

operator==, !=, <, <=, >, >=, <=> (std::shared_ptr)

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
 
 
Definiert in Header <memory>
Vergleicht zwei shared_ptr Objekte.
template< class T, class U >

bool operator==( const std::shared_ptr<T>& lhs,

                 const std::shared_ptr<U>& rhs ) noexcept;
(1) (seit C++11)
template< class T, class U >

bool operator!=( const std::shared_ptr<T>& lhs,

                 const std::shared_ptr<U>& rhs ) noexcept;
(2) (seit C++11)
(bis C++20)
template< class T, class U >

bool operator<( const std::shared_ptr<T>& lhs,

                const std::shared_ptr<U>& rhs ) noexcept;
(3) (seit C++11)
(bis C++20)
template< class T, class U >

bool operator>( const std::shared_ptr<T>& lhs,

                const std::shared_ptr<U>& rhs ) noexcept;
(4) (seit C++11)
(bis C++20)
template< class T, class U >

bool operator<=( const std::shared_ptr<T>& lhs,

                 const std::shared_ptr<U>& rhs ) noexcept;
(5) (seit C++11)
(bis C++20)
template< class T, class U >

bool operator>=( const std::shared_ptr<T>& lhs,

                 const std::shared_ptr<U>& rhs ) noexcept;
(6) (seit C++11)
(bis C++20)
template< class T, class U >

std::strong_ordering operator<=>( const std::shared_ptr<T>& lhs,

                                  const std::shared_ptr<U>& rhs ) noexcept;
(7) (seit C++20)
Vergleicht einen shared_ptr mit einem Nullzeiger.
template< class T >
bool operator==( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
(8) (seit C++11)
template< class T >
bool operator==( std::nullptr_t, const std::shared_ptr<T>& rhs ) noexcept;
(9) (seit C++11)
(bis C++20)
template< class T >
bool operator!=( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
(10) (seit C++11)
(bis C++20)
template< class T >
bool operator!=( std::nullptr_t, const std::shared_ptr<T>& rhs ) noexcept;
(11) (seit C++11)
(bis C++20)
template< class T >
bool operator<( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
(12) (seit C++11)
(bis C++20)
template< class T >
bool operator<( std::nullptr_t, const std::shared_ptr<T>& rhs ) noexcept;
(13) (seit C++11)
(bis C++20)
template< class T >
bool operator>( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
(14) (seit C++11)
(bis C++20)
template< class T >
bool operator>( std::nullptr_t, const std::shared_ptr<T>& rhs ) noexcept;
(15) (seit C++11)
(bis C++20)
template< class T >
bool operator<=( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
(16) (seit C++11)
(bis C++20)
template< class T >
bool operator<=( std::nullptr_t, const std::shared_ptr<T>& rhs ) noexcept;
(17) (seit C++11)
(bis C++20)
template< class T >
bool operator>=( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
(18) (seit C++11)
(bis C++20)
template< class T >
bool operator>=( std::nullptr_t, const std::shared_ptr<T>& rhs ) noexcept;
(19) (seit C++11)
(bis C++20)
template< class T >

std::strong_ordering operator<=>( const std::shared_ptr<T>& lhs,

                                  std::nullptr_t ) noexcept;
(20) (seit C++20)

Vergleicht zwei shared_ptr<T> Objekte oder vergleicht shared_ptr<T> mit einem Nullzeiger.

Beachten Sie, dass die Vergleichsoperatoren für shared_ptr einfach Zeigerwerte vergleichen; die tatsächlich verwalteten Objekte werden *nicht* verglichen. Die Definition von operator< für shared_ptr ermöglicht die Verwendung von shared_ptrs als Schlüssel in assoziativen Containern wie std::map und std::set.

Die Operatoren <, <=, >, >= und != sind synthetisiert aus operator<=> und operator== beziehungsweise.

(seit C++20)

Inhalt

[edit] Parameter

lhs - Der linke shared_ptr zum Vergleichen
rhs - Der rechte shared_ptr zum Vergleichen

[edit] Rückgabewert

1) lhs.get() == rhs.get()
2) !(lhs == rhs)
3) std::less<V>()(lhs.get(), rhs.get()), wobei V der zusammengesetzte Zeigertyp von std::shared_ptr<T>::element_type* und std::shared_ptr<U>::element_type* ist.
4) rhs < lhs
5) !(rhs < lhs)
6) !(lhs < rhs)
7) std::compare_three_way{}(x.get(), y.get())
8) !lhs
9) !rhs
10) (bool)lhs
11) (bool)rhs
12) std::less<std::shared_ptr<T>::element_type*>()(lhs.get(), nullptr)
13) std::less<std::shared_ptr<T>::element_type*>()(nullptr, rhs.get())
14) nullptr < lhs
15) rhs < nullptr
16) !(nullptr < lhs)
17) !(rhs < nullptr)
18) !(lhs < nullptr)
19) !(nullptr < rhs)
20) std::compare_three_way{}(x.get(), static_cast<std::shared_ptr<T>::element_type*>(nullptr))

[edit] Hinweise

In allen Fällen wird der gespeicherte Zeiger (derjenige, der von get() zurückgegeben wird) verglichen, nicht der verwaltete Zeiger (derjenige, der an den Deleter übergeben wird, wenn use_count Null erreicht). Die beiden Zeiger können sich bei einem shared_ptr unterscheiden, der mit dem Aliasing-Konstruktor erstellt wurde.

[edit] Beispiel

#include <iostream>
#include <memory>
 
int main()
{
    std::shared_ptr<int> p1(new int(42));
    std::shared_ptr<int> p2(new int(42));
 
    std::cout << std::boolalpha
        << "(p1 == p1)       : " << (p1 == p1) << '\n'
        << "(p1 <=> p1) == 0 : " << ((p1 <=> p1) == 0) << '\n' // Since C++20
 
    // p1 and p2 point to different memory locations, so p1 != p2
        << "(p1 == p2)       : " << (p1 == p2) << '\n'
        << "(p1 < p2)        : " << (p1 < p2) << '\n'
        << "(p1 <=> p2) < 0  : " << ((p1 <=> p2) < 0) << '\n'   // Since C++20
        << "(p1 <=> p2) == 0 : " << ((p1 <=> p2) == 0) << '\n'; // Since C++20
}

Mögliche Ausgabe

(p1 == p1)       : true
(p1 <=> p1) == 0 : true
(p1 == p2)       : false
(p1 < p2)        : true
(p1 <=> p2) < 0  : true
(p1 <=> p2) == 0 : false

[edit] 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 3427 C++20 operator<=>(shared_ptr, nullptr_t) war ill-formed Definition behoben

[edit] Siehe auch

gibt den gespeicherten Zeiger zurück
(public member function) [edit]