簡體   English   中英

在包含std :: string的函數上使用throw()后綴是否安全?

[英]Is it safe to use the throw() suffix on a function containing std::string?

我有一個不拋出任何東西的成員函數,所以我將throw()后綴附加到它的末尾,表明它不會拋出任何異常。

我的問題是,在功能我使用幾個std::string ,並讓說,不順心的事在初始化std::string ,它拋出bad_allocout_of_range (或者還有什么可以永遠去錯了性病::串)。

仍然添加throw()后綴仍然是安全的嗎?

赫伯薩特

例外規范所帶來的好處遠遠超過它們的價值

它會帶來更多問題,而不是帶來好處。 所以,在做這件事之前你應該考慮一下。

無論您是否編寫,異常規范都會對函數內部運行的所有代碼做出承諾。

如果std::string從函數內部拋出,那么該promise將被破壞,並且您的程序將失敗。 std::unexpected異常,通常意味着你的程序很難終止)

只有在以下情況下, throw()規范才適用:

  • 你的功能沒有任何東西可以拋出,甚至是間接的

要么

  • 您的函數捕獲所有此類異常並正常退出(無需重新拋出)。

兩件事情。

首先: throw()規范添加一個運行時檢查函數不拋出,如果promise被破壞則調用std::unexpected_exception ,這將終止程序。

第二:不建議使用throw() ,並且在C ++ 11中已棄用。 在C ++ 11中,您可以使用noexcept (或者更具延展性的形式noexcept(boolean-expression) )。 沒有創建運行時檢查,如果函數拋出,則行為未定義。

暫無
暫無

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

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