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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 18 大型程序工具)noexcept

發(fā)布時間:2025/3/21 c/c++ 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 18 大型程序工具)noexcept 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 通過提供 noexcept 說明 ( noexcept specification ) 指定某個函數(shù)不會拋出異常。 其形式是關(guān)鍵字 noexcept 緊跟在函數(shù)的參數(shù)列表后面

{// 緊跟在函數(shù)的參數(shù)列表后面// 該說明應(yīng)該在函數(shù)的尾置返回類型之前// 在成員函數(shù)中,noexcept說明符應(yīng)該出現(xiàn)在const以及引用限定之后// 而在final,override,或者虛函數(shù)的=0之前。void recoup(int) noexcept;//不會拋出異常void alloc(int);//可能會拋出異常//noexcept要么出現(xiàn)在該函數(shù)的所有聲明和定義語句中//要么一次也不出現(xiàn)。//我們也可以在函數(shù)指針的聲明和定義中指定noexcept//在typedef或類型別名中不能出現(xiàn)noexcept }

對于一個函數(shù)來說, noexcept 說明要么出現(xiàn)在該函數(shù)的所有聲明語句和定義語句中, 要么一次也不出現(xiàn)。

  • 該說明應(yīng)該在函數(shù)的尾置返回類型之前。

  • 也可以在函數(shù)指針的聲明和定義中指定 noexcept。

  • 在 typedef 或類型別名中則不能出現(xiàn) noexcept。

  • 在成員函數(shù)中, noexcept 說明符需要跟在 const 及引用限定符之后, 而在 final、 override 或虛函數(shù)的=0 之前

1.1 違反異常說明

編譯器并不會在編譯時檢查noexcept說明。如果在一個函數(shù)中說明了noexcept的同時又含有throw語句,或者調(diào)用可能拋出異常的其他函數(shù),編譯器將會順序編譯通過,并不會因?yàn)檫@種違反異常說明滾的情況而報錯。(又可能會有編譯器會提出警告)

// 盡管該函教明顯違反了異常說明, 但它仍然可以順利編譯通過 void f ( ) noexcept //承諾不會拋出異常 {throw exception ( ); / / 違反了異常說明 }

因此可能會出現(xiàn)一個函數(shù)既聲明了不會拋出異常,而又拋出了異常。此時,一旦拋出異常,程序就會調(diào)用terminate以確保遵守不在運(yùn)行時拋出異常的承諾。上述過程對是否執(zhí)行棧展開沒有約定。
因此noexcept用在兩種情況。

  • 我們確認(rèn)函數(shù)不會拋出異常
  • 我們根本不會處理該異常

1.2 異常說明的實(shí)參

noexcept 說明符接受一個可選的實(shí)參, 該實(shí)參必須能轉(zhuǎn)換為 bool 類型: 如果實(shí)參是 true, 則函數(shù)不會拋出異常; 如果實(shí)參是 false, 則函數(shù)可能拋出異常:

void recoup (int) noexcept (true); / / recoup 不會拋出異常 void alloc (int ) noexcept ( false);/ / alloc 可能拋出異常

1.3 noexcept 運(yùn)算符 (noexcept operator)

noexcept 運(yùn)算符是一個一元運(yùn)算符, 它的返回值是一個 bool 類型的右值常量表達(dá)式,用于表示給定的表達(dá)式是否會拋出異常
和sizeof一樣,noexcept也不會對該表達(dá)式求值。

eg. noexcept (recoup (i) ) // 如果 recoup 不拋出異常則結(jié)果為 true; 否則結(jié)果為 falsenoexcept (e) 當(dāng) e 調(diào)用的所有函數(shù)都做了不拋出說明且 e 本身不含有 throw 語句時, 上述表達(dá)式為 true; 否貝lj noexcept (e> 返回 falsevoid f ( ) noexcept (noexcept (g ( > ) ); //f 和 g 的異常說明一致 如果函數(shù) g 承諾了不會拋出異常, 則 f 也不會拋出異常; 如果 g 沒有異常說明符, 或者 g 雖然有異常說明符但是允許拋出異常, 則 f 也可能拋出異常

1.4 異常說明與指針、 虛函數(shù)和拷貝控制

1.4.1 指針

函數(shù)指針及該指針?biāo)傅暮瘮?shù)必須具有一致的異常說明。

  • 如果我們?yōu)槟硞€指針做了不拋出異常的聲明, 則該指針將只能指向不拋出異常的函數(shù)。
  • 如果我們顯式或隱式地說明了指針可能拋出異常, 則該指針可以指向任何函數(shù), 即使是承諾了不拋出
    異常的函數(shù)也可以
// recoup和pf1都承諾不會拋出異常 // alloc可能會拋出錯誤 void (*pf)(int) noexcept = recoup; void (*pf2)(int) = recoup;//正確 pf = alloc;//錯誤, pf2 = alloc;//正確

1.4.2 虛函數(shù)

如果一個虛函數(shù)承諾了它不會拋出異常,則它后續(xù)的派生類的虛函數(shù)也必須做出同樣的承諾。
如果基類的虛函數(shù)允許拋出異常時,我們可以設(shè)置派生類對應(yīng)的函數(shù)不能拋出異常,當(dāng)然也可以是允許拋出異常

class Base { public:virtual double f1(double) noexcept;// 顯式和隱式地指出可能會拋出異常virtual int f2() noexcept(false);virtual void f3(); };class D : public Base { public:double f1(double);//錯誤,沒有指明是noexceptint f2() noexcept(true);//正確,雖然基類的是可能拋出異常的void f3() noexcept;//正確,同上 };

1.4.3 拷貝控制成員

  • 當(dāng)編譯器合成拷貝控制成員時,同時也生成一個異常說明符。
  • 如果對所有成員和基類的所有操作都承諾了不會拋出異常,則合成的成員是noexcept的。
  • 如果合成成員調(diào)用的任意一個函數(shù)可能會拋出異常,則合成的成員是noexcept(false)的。
    -我們定義了一個析構(gòu)函數(shù),但是沒有為它提供異常說明,編譯器將會合成一個,合成的異常說明符將與假設(shè)編譯器為類合成的析構(gòu)函數(shù)時所得的異常說明一致。

總結(jié)

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)noexcept的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。