簡體   English   中英

std::set 上的異常安全事務

[英]Exception safe transactions on std::set

std::set<T> e;

void f(/* Some parameters. */) {
    /* Some non-throwing code. */

    try {
        e.erase(a);
        e.insert(b);
        e.erase(c);
    } catch(...) {
        // Undo failed operations.
    }
}

我希望 f 具有強大的異常保證,無論 T 類型如何。比方說,擦除 a 和插入 b 成功,但擦除 c 會拋出。 然后我必須撤消前兩個操作,但這將涉及在 catch 塊中從 e 插入和擦除,但這些操作也可以拋出。 有沒有辦法執行這個回滾? 我正在使用 C++17。

因此,如果發生破壞,強異常保證幾乎總是被拋棄。

由於異常而運行堆棧展開時,如果析構函數拋出您的程序調用 std terminate 幾乎相同的原因。

添加時,您可以復制整個集合,然后添加到副本中,然后交換 collections。 然后你可以銷毀副本; 但如果這種破壞發生了,真的沒有一個理智的選擇。 您不再需要說明此數據,並被告知此操作失敗。 那有什么意思? 您如何撤消“不需要此數據”?

要求查找< (或==hash )無異常。 對破壞做同樣的事情。 然后.erase也是 nothrow。 不要借用麻煩和設置瘋狂的類型; 大多數瘋狂的類型(它們可以存在)可以包裝在一個 sanity-wrapper 中並在 elsewhen 時處理異常。

暫無
暫無

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

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