std::owner_less
定义于头文件 <memory>
。
- C++11
- C++17
// 1)
template< class T >
struct owner_less; /* undefined */
// 2)
template< class T >
struct owner_less<std::shared_ptr<T>>;
// 3)
template< class T >
struct owner_less<std::weak_ptr<T>>;
// 1)
template< class T = void >
struct owner_less; /* undefined */
// 2)
template< class T >
struct owner_less<std::shared_ptr<T>>;
// 3)
template< class T >
struct owner_less<std::weak_ptr<T>>;
// 4)
template<>
struct owner_less<void>;
此函数对象提供基于所有者(而非基于值)的混合类型排序,适用于 std::weak_ptr 和 std::shared_ptr。其排序使得只有当两个智能指针都为空或它们共享所有权时,它们才被视为等效,即使通过 get() 获取的原始指针的值不同(例如,因为它们指向同一对象中的不同子对象)。
当使用 std::shared_ptr 或 std::weak_ptr 作为键构建关联容器时,此类模板是首选的比较谓词,例如:
std::map<std::shared_ptr<T>, U, std::owner_less<std::shared_ptr<T>>>
或
std::map<std::weak_ptr<T>, U, std::owner_less<std::weak_ptr<T>>>
.
默认的 operator<
未为弱指针定义,并且可能会错误地将同一对象的两个共享指针视为不等效(参见 shared_ptr::owner_before)。
特化
当未指定 T
时,标准库提供 std::owner_less 的特化。在这种情况下,参数类型从实参推导(每个实参仍必须是 std::shared_ptr 或 std::weak_ptr)。
pub | owner_less<void> | 提供共享指针和弱指针的混合类型基于所有者的排序的函数对象,无论被指向对象的类型如何 (类模板特化) (C++17 起) |
成员类型
(直到 C++20)
pub | 成员类型 | 定义 |
pub | result_type (C++17 中已弃用) | 2-3) bool |
pub | first_argument_type (C++17 中已弃用) | 2) std::shared_ptr<T> 3) std::weak_ptr<T> |
pub | second_argument_type (C++17 中已弃用) | 2) std::shared_ptr<T> 3) std::weak_ptr<T> |
成员函数
std::owner_less::operator()
仅属于 owner_less<shared_ptr<T>> 模板特化成员
bool operator()( const std::shared_ptr<T>& lhs,
const std::shared_ptr<T>& rhs ) const noexcept; // (since C++11)
仅属于 owner_less<weak_ptr<T>> 模板特化成员
bool operator()( const std::weak_ptr<T>& lhs,
const std::weak_ptr<T>& rhs ) const noexcept; // (since C++11)
两个模板特化共同的成员
bool operator()( const std::shared_ptr<T>& lhs,
const std::weak_ptr<T>& rhs ) const noexcept; // (since C++11)
bool operator()( const std::weak_ptr<T>& lhs,
const std::shared_ptr<T>& rhs ) const noexcept; // (since C++11)
使用基于所有者的语义比较 lhs
和 rhs
。实际调用 lhs.owner_before(rhs)
。
排序是严格弱排序关系。
lhs
和 rhs
仅当它们都为空或共享所有权时才等效。
参数
lhs
, rhs
- 要比较的共享所有权指针
返回值
如果 lhs
按照基于所有者的排序小于 rhs
,则为 true
。
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 2873 | C++11 | operator() 可能未声明 noexcept | 已声明 noexcept |