簡體   English   中英

std :: shared_ptr :: owner_before和std :: owner_less:“基於所有者的訂單”究竟是什么意思?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM