C 11 新特性 關鍵字noexcept

2021-09-24 21:01:46 字數 1323 閱讀 1328

從c++11開始,我們能看到很多**當中都有關鍵字noexcept。比如下面就是std::initializer_list的預設建構函式,其中使用了noexcept。

constexpr initializer_list() noexcept

: _m_array(0), _m_len(0)

該關鍵字告訴編譯器,函式中不會發生異常,這有利於編譯器對程式做更多的優化。

如果在執行時,noexecpt函式向外丟擲了異常(如果函式內部捕捉了異常並完成處理,這種情況不算丟擲異常),程式會直接終止,呼叫std::terminate()函式,該函式內部會呼叫std::abort()終止程式。

c++中的異常處理是在執行時而不是編譯時檢測的。為了實現執行時檢測,編譯器建立額外的**,然而這會妨礙程式優化。

在實踐中,一般兩種異常丟擲方式是常用的:

後面這一種方式中在以往的c++版本中常用throw()表示,在c++ 11中已經被noexcept代替。

void swap(type& x, type& y) throw()   //c++11之前

void swap(type& x, type& y) noexcept //c++11

在第2節中單獨使用noexcept,表示其所限定的swap函式絕對不發生異常。然而,使用方式可以更加靈活,表明在一定條件下不發生異常。

void swap(type& x, type& y) noexcept(noexcept(x.swap(y)))    //c++11

它表示,如果操作x.swap(y)不發生異常,那麼函式swap(type& x, type& y)一定不發生異常。

乙個更好的示例是std::pair中的移動分配函式(move assignment),它表明,如果型別t1和t2的移動分配(move assign)過程中不發生異常,那麼該移動建構函式就不會發生異常。

pair& operator=(pair&& __p)

noexcept(__and_,

is_nothrow_move_assignable<_t2>>::value)

使用noexcept表明函式或操作不會發生異常,會給編譯器更大的優化空間。然而,並不是加上noexcept就能提高效率,步子邁大了也容易扯著蛋。

以下情形鼓勵使用noexcept:

struct x;};

int main()

最後強調一句,在不是以上情況或者沒把握的情況下,不要輕易使用noexception。

C 11新特性 auto關鍵字

熟悉指令碼語言的人都知道,很多指令碼語言都引入了 型別自動推斷 技術 比如python,可以直接宣告變數,在執行時進行型別檢查。隨著c 11標準的發布,c 語言也引入了型別自動推斷的功能,這就是我們今天要介紹的auto關鍵字。c 是一種強型別語言,宣告變數時必須明確指出其型別。但是,在實踐中,優勢我...

C 11新特性 auto關鍵字

在c 98標準中就存在著auto關鍵字,c 98標準中auto關鍵字用於自動變數的宣告,但在預設情況下即使不宣告auto,函式內部的變數也是具有自動儲存期的。因此由於使用極少且多餘,在c 11中已刪除這一用法。void fun c 11新標準引入了auto型別說明符,採用它可以讓編譯器幫助我們分析表...

C 11新特性 auto關鍵字

include include using namespace std template void add t t,u u int main templatet,class u auto add t t,u u decltype t u auto a 10 auto pa new auto a au...