From cppreference.com
Defined in header
Compare two shared_ptr objects.
template<classT,classU>booloperator==(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (1)(since C++11)
(constexpr since C++26)template<classT,classU>booloperator!=(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (2) (since C++11)
(until C++20)template<classT,classU>booloperator<(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (3) (since C++11)
(until C++20)template<classT,classU>booloperator>(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (4) (since C++11)
(until C++20)template<classT,classU>booloperator<=(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (5) (since C++11)
(until C++20)template<classT,classU>booloperator>=(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (6) (since C++11)
(until C++20)template<classT,classU>std::strong_orderingoperator<=>(conststd::shared_ptr<T>&lhs,conststd::shared_ptr<U>&rhs)noexcept; (7)(since C++20)
(constexpr since C++26)Compare a shared_ptr with a null pointer.
template<classT>booloperator==(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (8)(since C++11)
(constexpr since C++26)template<classT>booloperator==(std::nullptr_t,conststd::shared_ptr<T>&rhs)noexcept; (9) (since C++11)
(until C++20)template<classT>booloperator!=(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (10) (since C++11)
(until C++20)template<classT>booloperator!=(std::nullptr_t,conststd::shared_ptr<T>&rhs)noexcept; (11) (since C++11)
(until C++20)template<classT>booloperator<(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (12) (since C++11)
(until C++20)template<classT>booloperator<(std::nullptr_t,conststd::shared_ptr<T>&rhs)noexcept; (13) (since C++11)
(until C++20)template<classT>booloperator>(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (14) (since C++11)
(until C++20)template<classT>booloperator>(std::nullptr_t,conststd::shared_ptr<T>&rhs)noexcept; (15) (since C++11)
(until C++20)template<classT>booloperator<=(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (16) (since C++11)
(until C++20)template<classT>booloperator<=(std::nullptr_t,conststd::shared_ptr<T>&rhs)noexcept; (17) (since C++11)
(until C++20)template<classT>booloperator>=(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (18) (since C++11)
(until C++20)template<classT>booloperator>=(std::nullptr_t,conststd::shared_ptr<T>&rhs)noexcept; (19) (since C++11)
(until C++20)template<classT>std::strong_orderingoperator<=>(conststd::shared_ptr<T>&lhs,std::nullptr_t)noexcept; (20)(since C++20)
(constexpr since C++26)Compares two shared_ptr<T> objects or compares shared_ptr<T> with a null pointer.
Note that the comparison operators for shared_ptr simply compare pointer values; the actual objects pointed to are not compared. Having operator< defined for shared_ptr allows shared_ptrs to be used as keys in associative containers, like
and
.
The <, <=, >, >=, and != operators are
from operator<=> and operator== respectively.
(since C++20)Parameters
lhs - the left-hand shared_ptr to compare rhs - the right-hand shared_ptr to compare Return value
1)lhs.get()==rhs.get()
2)!(lhs==rhs)
3)std::less<V>()(lhs.get(),rhs.get()), where V is the
of std::shared_ptr<T>::element_type* and std::shared_ptr<U>::element_type*.
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))
Notes
In all cases, it is the stored pointer (the one returned by
) that is compared, rather than the managed pointer (the one passed to the deleter when
goes to zero). The two pointers may differ in a
created using the aliasing constructor.
Example
Run this code
#include<iostream>#include<memory>intmain(){std::shared_ptr<int>p1(newint(42));std::shared_ptr<int>p2(newint(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}Possible output:
(p1 == p1) : true (p1 <=> p1) == 0 : true (p1 == p2) : false (p1 < p2) : true (p1 <=> p2) < 0 : true (p1 <=> p2) == 0 : false Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++20 operator<=>(shared_ptr, nullptr_t) was ill-formed definition fixed See also
returns the stored pointer
(public member function)