# std::weak_ptr<T>::owner_before

< cpp‎ | memory‎ | weak ptr

template< class Y > bool owner_before( const weak_ptr<Y>& other) const noexcept; |  |
template< class Y > bool owner_before( const std::shared_ptr<Y>& other) const noexcept; |  |

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

此顺序用于令共享和弱指针可用作关联容器中的关键，通常经由 std::owner_less 。

### 参数

other | - | 要比较的 std::shared_ptr 或 std::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

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2873 | C++11 | `owner_before` 可以不声明为 noexcept | 声明为 noexcept
LWG 2942 | C++11 | `weak_ptr::owner_before` 在 LWG 2873 的解决方案中缺少 noexcept | 令之为 noexcept

### 参阅

owner_less (C++11) | 提供基于所有者的，共享指针和弱指针的混合类型的排序 (类模板)