C++11: 指定函式是否可能會擲回例外狀況。
語法
noexcept-specifier:
noexcept
noexcept-expression
throw
(
)
noexcept-expression:
noexcept
(
constant-expression
)
參數
constant-expression
型 bool 別的常數表示式,表示可能例外狀況類型的集合是否空白。 沒有條件版本相當於 noexcept(true)。
備註
noexcept-expression是一種例外狀況規格:函式宣告的後綴,代表例外狀況處理程式可能會比對結束函式的任何例外狀況的一組型別。 產生 true時constant_expression,一元條件運算符noexcept(constant_expression)及其無條件同義字 noexcept,指定可以結束函式的潛在例外狀況類型集合是空的。 也就是說,函式絕不會擲回例外狀況,而且絕不允許將例外狀況傳播到其範圍之外。
noexcept(constant_expression)當產生 false時constant_expression,運算符或沒有例外狀況規格(除了解構函式或解除分配函式以外),表示可以結束函式的潛在例外狀況集合是所有型別的集合。
只有當函式呼叫的所有函式直接或間接都是 或 const時,才會將函noexcept式標示為 noexcept 。 編譯程式不一定檢查每個程式代碼路徑是否有可能會升至函式的例外狀況 noexcept 。 如果例外狀況確實結束標示 noexceptstd::terminate 為的函式外部範圍,則會立即叫用 ,而且不保證會叫用任何範圍內物件的解構函式。 使用 noexcept ,而不是動態例外狀況規範 throw()。
動態例外狀況規格或throw(optional_type_list)規格在 C++11 中已被取代,並在 C++17 中移除,但除外throw(),這是的noexcept(true)別名。 建議您套用 noexcept 至任何絕不允許例外狀況傳播呼叫堆疊的函式。 宣告函式 noexcept時,它可讓編譯程式在數個不同的內容中產生更有效率的程序代碼。 如需詳細資訊,請參閱 例外狀況規格。
範例
複製其自變數的函式範本可能會在複製的物件是一般舊數據類型 (POD) 的條件上宣告 noexcept 。 這類函式可以像這樣宣告:
#include <type_traits>
template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
// ...
}