std :: shared_ptr :: owner_before和std :: owner_less:“基于所有者的订单”究竟是什么意思?

时间:2014-02-17 16:21:02

标签: c++ c++11

我已经就此发现了一些讨论,但似乎没有任何内容可以指明“基于所有者的订单”实际上是什么。

它是否有效地评估了<拥有的指针内存地址的值?

2 个答案:

答案 0 :(得分:9)

它定义了一个任意严格的弱排序,当两个指针相同时,当且仅当它们共享所有权或者都是空的时。

等效性以通常的方式定义:

bool equivalent(p1, p2) {
    return !p1.owner_before(p2) && !p2.owner_before(p1);
}

这并不一定意味着他们指向同一个对象。两个指针可以指向不同的对象,但仍然共享所有权:

struct thing {int n;};
shared_ptr<thing> t1 = make_shared<thing>();
shared_ptr<int>   t2(t1, &t1->n);

assert(t1 != t2);          // point to different objects
assert(equivalent(t1,t2)); // share ownership

同样,两个指针可以指向同一个对象而不共享:

thing t;
shared_ptr<thing> t1(&t, some_deleter());
shared_ptr<thing> t2(&t, some_deleter());

assert(t1 == t2);            // point to the same object
assert(!equivalent(t1, t2)); // don't share ownership

(当然,这对于默认删除器来说是灾难性的,因为两者都会尝试删除对象;但是对于这种具有合适自定义删除器的东西,有合理的应用程序。)

实际上,这可以通过比较用于共享引用计数的内部结构的地址来实现。

答案 1 :(得分:4)

从语义上讲,这意味着两个shared_ptr比较相等,只有当它们共享所有权或同时nullptr时才会相等,否则shared_ptr会有一些一致的排序。

实际上,这种排序是通过比较内部指针与在“共享所有权”shared_ptr之间共享的参考控制块来实现的。请注意,可以通过构造函数创建具有不同shared_ptr且共享所有权的get()

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

这对于发送指向shared_ptr所持对象成员的指针很有用。