【发布时间】:2014-02-18 00:44:26
【问题描述】:
我发现了一些关于此的讨论,但似乎没有任何内容具体说明“基于所有者的订单”实际上是什么。
它是否有效地根据拥有的指针内存地址的值评估<?
【问题讨论】:
我发现了一些关于此的讨论,但似乎没有任何内容具体说明“基于所有者的订单”实际上是什么。
它是否有效地根据拥有的指针内存地址的值评估<?
【问题讨论】:
它定义了一个任意严格的弱排序,在该排序下,两个指针当且仅当它们共享所有权或都为空时才是等价的。
等价是按通常的方式定义的:
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
(当然,这对于默认删除器来说将是灾难性的,因为两者都会尝试删除对象;但是对于这种事情有合适的自定义删除器的合理应用)。
实际上,这可以通过比较用于共享引用计数的内部结构的地址来实现。
【讨论】:
从语义上讲,这意味着两个shared_ptrs 比较相等,前提是它们共享所有权或都是nullptr,否则shared_ptrs 的顺序是一致的。
实际上,这种排序是通过将内部指针与在“共享所有权”的shared_ptrs 之间共享的引用控制块进行比较来实现的。请注意,可以通过构造函数创建具有不同 get() 的 shared_ptrs 共享所有权:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
这很有用,例如,用于分发指向 shared_ptr 持有的对象成员的指针。
【讨论】:
shared_ptr( const shared_ptr<Y>& r, T *ptr ); 的优点。
shared_ptr 的别名构造函数一起工作的,但是仅仅说存在一些一致的顺序听起来仍然过于模糊。例如。我期望这个顺序不会改变什么样的时间表......?它没有回答我是否应该将其视为比较指针值本身的问题?