std::shared_ptr::owner_before 和 std::owner_less:"owner-based order"到底是什么意思?
std::shared_ptr::owner_before and std::owner_less: What exactly is meant by "owner-based order"?
我发现了一些关于这个问题的讨论,但似乎没有任何内容指定"基于所有者的订单"实际上是什么。
它是否有效地评估了对拥有的指针内存地址的值<
?
它定义了一个任意的严格弱排序,在该排序下,当且仅当两个指针共享所有权或均为空时,它们才等效。
等价以通常的方式定义:
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_ptr
比较相等,如果只有当它们共享所有权或都是nullptr
,否则shared_ptr
s有一些一致的顺序。
实际上,此排序是通过将内部指针与"共享所有权"shared_ptr
共享的引用控制块进行比较来实现的。请注意,可以通过构造函数创建具有不同get()
的shared_ptr
:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
这很有用,例如,用于向shared_ptr
持有的对象的成员分发指针。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- std::shared_ptr::owner_before 和 std::owner_less:"owner-based order"到底是什么意思?