[英]Is there an STL comparator for std::set (or std::map) with shared_ptr keys that provides value-based lookups? What exactly does std::owner_less do?
[英]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
排序。
實際上,這種排序是通過將內部指針與在“共享所有權”的shared_ptr
之間共享的參考控制塊進行比較來實現的。 請注意,可以創建具有不同get()
shared_ptr
,它們通過構造函數共享所有權:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
這對於分發指向shared_ptr
所持有的對象的成員的指針是有用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.