簡體   English   中英

std :: owner_less做什么?

[英]What does std::owner_less do?

我讀過std :: owner_less執行“基於所有者而不是基於值”的排序,如果兩個智能指針“指向同一對象的子對象”,則它們是等效的-究竟是什么意思?

作為測試用例,我編寫了以下代碼:

struct T {};

int main() {
    T* t = new T();

    std::shared_ptr<T> a(t);
    std::shared_ptr<T> b(t);

    std::set<std::shared_ptr<T>> set1;
    set1.insert(a);
    std::cout << set1.size() << std::endl;
    set1.insert(b);
    std::cout << set1.size() << std::endl;

    std::set<std::shared_ptr<T>, std::owner_less<std::shared_ptr<T>>> set2;
    set2.insert(a);
    std::cout << set2.size() << std::endl;
    set2.insert(b);
    std::cout << set2.size() << std::endl;
}

輸出為1 1 12。在我看來,如果std :: owner_less執行“基於所有者的”比較,則不應該將a和b視為相同,而默認比較器將它們視為不同嗎? 我的代碼的結果似乎是相反的。

std::shared_ptr<T> a(t);
std::shared_ptr<T> b(t);

shared_ptr被銷毀時,這是未定義的行為。 兩個shared_ptr不知道彼此的存在,並且每個都將嘗試刪除t


owner_less可以被認為是“在(真實或隱喻)控制塊的地址上排序”。 因此,如果它們共享所有權或都為空,則認為等效的兩個shared_ptr (和weak_ptr ):

struct T { int x, y; };

std::shared_ptr<T> a(new T{});
std::shared_ptr<T> b = a;

std::shared_ptr<int> c(a, &a->y); // aliasing constructor

std::shared_ptr<T> d(a.get(), [](T*){}); // null deleter to avoid no double delete
std::shared_ptr<T> e(std::shared_ptr<T>(), a.get()); // "non-owning" empty shared_ptr with a non-null stored pointer

根據owner_lessabc都是等效的,因為它們共享所有權。 d不共享所有權的a (它有自己的“控制塊”),根據不同的到所以它的owner_less 同樣,對於e ,它為空(什么也不擁有),但是存儲了一個非null的指針。

默認的比較器僅比較存儲的指針或get() 它將看到abde都是等效的,而c不同(假定您將雙方都轉換為shared_ptr<void>以便它們具有可比性)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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