C 11中的noexcept修飾符

2021-10-03 23:36:16 字數 1716 閱讀 8766

在c++11標準之前,c++在函式宣告中有exception specification(異常宣告)的功能,用來指定函式可能丟擲的異常型別。

voidfunc0() throw(runtime_error);

voidfunc1() throw();

voidfunc2();

函式func0可能丟擲runtime_error型別的異常;函式func1不會丟擲任何異常;函式func2沒有異常說明,則該函式可以丟擲任何型別的異常。

如果函式丟擲了沒有在異常說明中列出的異常,則編譯器會呼叫標準庫函式unexpected。預設情況下,unexpected函式會呼叫terminate函式終止程式。

這種異常宣告的功能很少使用,因此在c++11中被棄用。c++11引入noexcept,具體用法如下。

voidfunc3() noexcept;
noexcept的功能相當於上面的throw(),表示函式不會丟擲異常。如果noexcept修飾的函式丟擲了異常,編譯器可以選擇直接呼叫std::terminate()終止程式執行。noexcept比throw()效率高一些。

voidfunc4() noexcept(常量表示式);
如果常量表示式的結果為true,表示該函式不會丟擲異常,反之則有可能丟擲異常。不帶常量表示式的noexcept相當於noexcept(true)。

上面noexcept的用法是其作為修飾符時的用法,實際上noexcept還可以作為操作符,常用於模板中。

template voidfunc5() noexcept( noexcept(t()) ) {}
第2個noexcept就是乙個操作符,如果其引數是乙個有可能丟擲異常的表示式,則返回值為false(func5為noexcept(false),有可能會丟擲異常),否則返回值為true(func5為noexcept(true),不會丟擲異常)。

這樣函式是否會丟擲異常,可以由表示式進行推導,使得c++11更好的支援泛型程式設計。

noexcept被大量的使用在c++11的標準庫中,用於提高標準庫的效能,以及滿足一些阻止異常擴散的需求。隨便在c++11標準文件中搜尋一下noexcept關鍵字,就知道它的應用有多廣泛了。

c++11預設將delete設定成noexcept,這樣可以提高應用程式的安全性,因為在析構函式中不應該丟擲異常,而析構函式中經常會呼叫delete。

voidoperator delete(void* ptr) noexcept;

voidoperator delete(void* ptr, const std::nothrow_t&) noexcept;

voidoperator delete(void* ptr) noexcept;

voidoperator delete(void* ptr, const std::nothrow_t&) noexcept;

voidoperator delete(void* ptr, void*) noexcept;

voidoperator delete(void* ptr, void*) noexcept;

同樣出於安全因素考慮,c++11將類的析構函式預設為noexcept(true)。但如果程式設計師顯示的為析構函式指定noexcept(false),或者類的基類或成員有noexcept(false)的析構函式,則析構函式不會再保持預設值。

C 11 新特性 關鍵字noexcept

從c 11開始,我們能看到很多 當中都有關鍵字noexcept。比如下面就是std initializer list的預設建構函式,其中使用了noexcept。constexpr initializer list noexcept m array 0 m len 0 該關鍵字告訴編譯器,函式中不會發...

C 11異常處理關鍵字 noexcept

斷言 assertion 是一種程式設計中常用的手段。相比於斷言適用於排除邏輯上不可能存在的狀態,異常通常是用於邏輯上可能發生的錯誤。在c 98中,我們看到了一套完整的不同於c的異常處理系統。通過這套異常處理系統,c 擁有了遠比c強大的異常處理功能。下面來一起了解一下吧。c 11開始,我們能看到很多...

const修飾符(C 11標準)

const物件建立之後,就不能改變其值,所以在定義時必須對其初始化。如果利用乙個物件對const物件進行初始化,則它們可以是不是const型別沒有關係。int i 1 const ci i 正確 int j ci 正確 當嘗試改變ci的值時,ci的常量特性才發揮作用 預設情況下,const物件僅在定...