std::shared_ptr::owner_before

来自cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
工具库
类型支持(基本类型、 RTTI 、类型特性)
动态内存管理
错误处理
程序工具
变参数函数
日期和时间
函数对象
(C++11)
关系运算符
optionalanyvariant (C++17)
pair 与 tuple
(C++11)
(C++17)
swap 、 forward 与 move
(C++14)
(C++11)
(C++11)
初等字符串转换
(C++17)
(C++17)
类型运算
(C++11)
(C++17)
 
动态内存管理
 
 
template< class Y >
bool owner_before( const shared_ptr<Y>& other) const;
(C++17 前)
template< class Y >
bool owner_before( const shared_ptr<Y>& other) const noexcept;
(C++17 起)
template< class Y >
bool owner_before( const std::weak_ptr<Y>& other) const;
(C++17 前)
template< class Y >
bool owner_before( const std::weak_ptr<Y>& other) const noexcept;
(C++17 起)

以实现定义的基于拥有者(与基于值想法)顺序,检查此 shared_ptr 是否先于 other 。二个智能指针仅若都占有同一对象或均为空才比较相等,即使由 get() 获得的指针不同(例如因为它们指向同一对象中的不同子对象)。

此顺序用于令共享和弱指针可用作关联容器中的关键,典型地通过 std::owner_less

目录

[编辑] 参数

other - 要比较的 std::shared_ptrstd::weak_ptr

[编辑] 返回值

*this 前于 other 则为 true ,否则为 false 。常见实现比较控制块的地址。


[编辑] 示例

#include <iostream>
#include <memory>
 
struct Foo {
    int n1;
    int n2; 
    Foo(int a, int b) : n1(a), n2(b) {}
};
int main()
{   
    auto p1 = std::make_shared<Foo>(1, 2);
    std::shared_ptr<int> p2(p1, &p1->n1);
    std::shared_ptr<int> p3(p1, &p1->n2);
 
    std::cout << std::boolalpha
              << "p2 < p3 " << (p2 < p3) << '\n'
              << "p3 < p2 " << (p3 < p2) << '\n'
              << "p2.owner_before(p3) " << p2.owner_before(p3) << '\n'
              << "p3.owner_before(p2) " << p3.owner_before(p2) << '\n';
 
    std::weak_ptr<int> w2(p2);
    std::weak_ptr<int> w3(p3);
    std::cout 
//              << "w2 < w3 " << (w2 < w3) << '\n'  // won't compile 
//              << "w3 < w2 " << (w3 < w2) << '\n'  // won't compile
              << "w2.owner_before(w3) " << w2.owner_before(w3) << '\n'
              << "w3.owner_before(w2) " << w3.owner_before(w2) << '\n';
 
}

输出:

p2 < p3 true
p3 < p2 false
p2.owner_before(p3) false
p3.owner_before(p2) false
w2.owner_before(w3) false
w3.owner_before(w2) false

[编辑] 参阅

提供基于占有者的,混合类型的共享指针和弱指针排序
(类模板) [编辑]