日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++11 新特性 —— 关键字noexcept

發布時間:2023/12/20 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11 新特性 —— 关键字noexcept 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載;https://www.cnblogs.com/sword03/p/10020344.html

1 關鍵字noexcept

從C++11開始,我們能看到很多代碼當中都有關鍵字noexcept。比如下面就是std::initializer_list的默認構造函數,其中使用了noexcept。

constexpr initializer_list() noexcept: _M_array(0), _M_len(0) { }

該關鍵字告訴編譯器,函數中不會發生異常,這有利于編譯器對程序做更多的優化。
如果在運行時,noexecpt函數向外拋出了異常(如果函數內部捕捉了異常并完成處理,這種情況不算拋出異常),程序會直接終止,調用std::terminate()函數,該函數內部會調用std::abort()終止程序。

2 C++的異常處理

C++中的異常處理是在運行時而不是編譯時檢測的。為了實現運行時檢測,編譯器創建額外的代碼,然而這會妨礙程序優化。
在實踐中,一般兩種異常拋出方式是常用的:

  • 一個操作或者函數可能會拋出一個異常;
  • 一個操作或者函數不可能拋出任何異常。

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

void swap(Type& x, Type& y) throw() //C++11之前{x.swap(y);}void swap(Type& x, Type& y) noexcept //C++11{x.swap(y);}

3 有條件的noexcecpt

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

void swap(Type& x, Type& y) noexcept(noexcept(x.swap(y))) //C++11{x.swap(y);}

它表示,如果操作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<_T1>,is_nothrow_move_assignable<_T2>>::value){first = std::forward<first_type>(__p.first);second = std::forward<second_type>(__p.second);return *this;}

4 什么時候該使用noexcept?

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

  • 移動構造函數(move constructor)
  • 移動分配函數(move assignment)
  • 析構函數(destructor)。這里提一句,在新版本的編譯器中,析構函數是默認加上關鍵字noexcept的。下面代碼可以檢測編譯器是否給析構函數加上關鍵字noexcept。
struct X{~X() { };};int main(){X x;// This will not fire even in GCC 4.7.2 if the destructor is// explicitly marked as noexcept(true)static_assert(noexcept(x.~X()), "Ouch!");}
  • 葉子函數(Leaf Function)。葉子函數是指在函數內部不分配棧空間,也不調用其它函數,也不存儲非易失性寄存器,也不處理異常。

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

總結

以上是生活随笔為你收集整理的C++11 新特性 —— 关键字noexcept的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。