std::weak_ptr<T>::owner_before
来自 cppreference.com
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 2083 | C++11 | owner_before 未声明为 const |
声明为 const |
LWG 2942 | C++11 | owner_before 未声明为 noexcept |
声明为noexcept |
[编辑] 另请参见
(C++11) |
提供基于所有权的混合类型排序,用于共享指针和弱指针 (类模板) |