跳到主要内容

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

定义于头文件 <memory>

比较两个 shared_ptr 对象

// 1)
template < class T, class U >
bool operator==( const std::shared_ptr<T>& lhs,
const std::shared_ptr<U>& rhs ) noexcept;
// 7)
template< class T, class U >
std::strong_ordering operator<=>( const std::shared_ptr<T>& lhs,
const std::shared_ptr<U>& rhs ) noexcept;

比较 shared_ptr 和空指针

// 8)
template< class T >
bool operator==( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
// 20)
template< class T >
std::strong_ordering operator<=>( const std::shared_ptr<T>& lhs,
std::nullptr_t ) noexcept;

比较两个 shared_ptr<T> 对象,或比较 shared_ptr<T>null 指针。

请注意,shared_ptr 的比较运算符仅比较指针值;不比较实际指向的对象。为 shared_ptr 定义 operator< 允许 shared_ptr 作为关联容器(如 std::mapstd::set)的键。

(自 C++20 起)<, <=, >, >=, 和 != 运算符分别从 operator<=>operator== 合成而来。

参数

lhs - 要比较的左侧 shared_ptr rhs - 要比较的右侧 shared_ptr

返回值

  1. lhs.get() == rhs.get()
  2. !(lhs == rhs)
  3. std::less<V>()(lhs.get(), rhs.get()),其中 Vstd::shared_ptr<T>::element_type*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))

备注

在所有情况下,比较的是存储的指针(由 get() 返回的指针),而不是托管的指针(当 use_count 变为零时传递给删除器的指针)。使用别名构造函数创建的 shared_ptr 中,这两个指针可能不同。

示例

#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
}
可能结果
(p1 == p1)       : true
(p1 <=> p1) == 0 : true
(p1 == p2) : false
(p1 < p2) : true
(p1 <=> p2) < 0 : true
(p1 <=> p2) == 0 : false

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 3427C++20operator<=>(shared_ptr, nullptr_t) 是 ill-formed(格式不正确)定义已修复

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

定义于头文件 <memory>

比较两个 shared_ptr 对象

// 1)
template < class T, class U >
bool operator==( const std::shared_ptr<T>& lhs,
const std::shared_ptr<U>& rhs ) noexcept;
// 7)
template< class T, class U >
std::strong_ordering operator<=>( const std::shared_ptr<T>& lhs,
const std::shared_ptr<U>& rhs ) noexcept;

比较 shared_ptr 和空指针

// 8)
template< class T >
bool operator==( const std::shared_ptr<T>& lhs, std::nullptr_t ) noexcept;
// 20)
template< class T >
std::strong_ordering operator<=>( const std::shared_ptr<T>& lhs,
std::nullptr_t ) noexcept;

比较两个 shared_ptr<T> 对象,或比较 shared_ptr<T>null 指针。

请注意,shared_ptr 的比较运算符仅比较指针值;不比较实际指向的对象。为 shared_ptr 定义 operator< 允许 shared_ptr 作为关联容器(如 std::mapstd::set)的键。

(自 C++20 起)<, <=, >, >=, 和 != 运算符分别从 operator<=>operator== 合成而来。

参数

lhs - 要比较的左侧 shared_ptr rhs - 要比较的右侧 shared_ptr

返回值

  1. lhs.get() == rhs.get()
  2. !(lhs == rhs)
  3. std::less<V>()(lhs.get(), rhs.get()),其中 Vstd::shared_ptr<T>::element_type*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))

备注

在所有情况下,比较的是存储的指针(由 get() 返回的指针),而不是托管的指针(当 use_count 变为零时传递给删除器的指针)。使用别名构造函数创建的 shared_ptr 中,这两个指针可能不同。

示例

#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
}
可能结果
(p1 == p1)       : true
(p1 <=> p1) == 0 : true
(p1 == p2) : false
(p1 < p2) : true
(p1 <=> p2) < 0 : true
(p1 <=> p2) == 0 : false

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 3427C++20operator<=>(shared_ptr, nullptr_t) 是 ill-formed(格式不正确)定义已修复