跳到主要内容

std::owner_less

定义于头文件 <memory>

// 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>>;

此函数对象提供基于所有者(而非基于值)的混合类型排序,适用于 std::weak_ptrstd::shared_ptr。其排序使得只有当两个智能指针都为空或它们共享所有权时,它们才被视为等效,即使通过 get() 获取的原始指针的值不同(例如,因为它们指向同一对象中的不同子对象)。

当使用 std::shared_ptrstd::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_ptrstd::weak_ptr)。

pubowner_less<void>提供共享指针和弱指针的混合类型基于所有者的排序的函数对象,无论被指向对象的类型如何
(类模板特化) (C++17 起)

成员类型

(直到 C++20)

pub成员类型定义
pubresult_type (C++17 中已弃用) 2-3) bool
pubfirst_argument_type (C++17 中已弃用) 2) std::shared_ptr<T>
3) std::weak_ptr<T>
pubsecond_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)

使用基于所有者的语义比较 lhsrhs。实际调用 lhs.owner_before(rhs)

排序是严格弱排序关系。

lhsrhs 仅当它们都为空或共享所有权时才等效。

参数

lhs, rhs - 要比较的共享所有权指针

返回值

如果 lhs 按照基于所有者的排序小于 rhs,则为 true


缺陷报告

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

DR应用于发布时的行为正确行为
LWG 2873C++11operator() 可能未声明 noexcept已声明 noexcept

std::owner_less

定义于头文件 <memory>

// 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>>;

此函数对象提供基于所有者(而非基于值)的混合类型排序,适用于 std::weak_ptrstd::shared_ptr。其排序使得只有当两个智能指针都为空或它们共享所有权时,它们才被视为等效,即使通过 get() 获取的原始指针的值不同(例如,因为它们指向同一对象中的不同子对象)。

当使用 std::shared_ptrstd::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_ptrstd::weak_ptr)。

pubowner_less<void>提供共享指针和弱指针的混合类型基于所有者的排序的函数对象,无论被指向对象的类型如何
(类模板特化) (C++17 起)

成员类型

(直到 C++20)

pub成员类型定义
pubresult_type (C++17 中已弃用) 2-3) bool
pubfirst_argument_type (C++17 中已弃用) 2) std::shared_ptr<T>
3) std::weak_ptr<T>
pubsecond_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)

使用基于所有者的语义比较 lhsrhs。实际调用 lhs.owner_before(rhs)

排序是严格弱排序关系。

lhsrhs 仅当它们都为空或共享所有权时才等效。

参数

lhs, rhs - 要比较的共享所有权指针

返回值

如果 lhs 按照基于所有者的排序小于 rhs,则为 true


缺陷报告

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

DR应用于发布时的行为正确行为
LWG 2873C++11operator() 可能未声明 noexcept已声明 noexcept