C++ Primer 5th笔记(chap 18 大型程序工具)noexcept
1. 通過提供 noexcept 說明 ( noexcept specification ) 指定某個(gè)函數(shù)不會(huì)拋出異常。 其形式是關(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;//不會(huì)拋出異常void alloc(int);//可能會(huì)拋出異常//noexcept要么出現(xiàn)在該函數(shù)的所有聲明和定義語句中//要么一次也不出現(xiàn)。//我們也可以在函數(shù)指針的聲明和定義中指定noexcept//在typedef或類型別名中不能出現(xiàn)noexcept }對(duì)于一個(gè)函數(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 違反異常說明
編譯器并不會(huì)在編譯時(shí)檢查noexcept說明。如果在一個(gè)函數(shù)中說明了noexcept的同時(shí)又含有throw語句,或者調(diào)用可能拋出異常的其他函數(shù),編譯器將會(huì)順序編譯通過,并不會(huì)因?yàn)檫@種違反異常說明滾的情況而報(bào)錯(cuò)。(又可能會(huì)有編譯器會(huì)提出警告)
// 盡管該函教明顯違反了異常說明, 但它仍然可以順利編譯通過 void f ( ) noexcept //承諾不會(huì)拋出異常 {throw exception ( ); / / 違反了異常說明 }因此可能會(huì)出現(xiàn)一個(gè)函數(shù)既聲明了不會(huì)拋出異常,而又拋出了異常。此時(shí),一旦拋出異常,程序就會(huì)調(diào)用terminate以確保遵守不在運(yùn)行時(shí)拋出異常的承諾。上述過程對(duì)是否執(zhí)行棧展開沒有約定。
因此noexcept用在兩種情況。
- 我們確認(rèn)函數(shù)不會(huì)拋出異常
- 我們根本不會(huì)處理該異常
1.2 異常說明的實(shí)參
noexcept 說明符接受一個(gè)可選的實(shí)參, 該實(shí)參必須能轉(zhuǎn)換為 bool 類型: 如果實(shí)參是 true, 則函數(shù)不會(huì)拋出異常; 如果實(shí)參是 false, 則函數(shù)可能拋出異常:
void recoup (int) noexcept (true); / / recoup 不會(huì)拋出異常 void alloc (int ) noexcept ( false);/ / alloc 可能拋出異常1.3 noexcept 運(yùn)算符 (noexcept operator)
noexcept 運(yùn)算符是一個(gè)一元運(yùn)算符, 它的返回值是一個(gè) bool 類型的右值常量表達(dá)式,用于表示給定的表達(dá)式是否會(huì)拋出異常
和sizeof一樣,noexcept也不會(huì)對(duì)該表達(dá)式求值。
1.4 異常說明與指針、 虛函數(shù)和拷貝控制
1.4.1 指針
函數(shù)指針及該指針?biāo)傅暮瘮?shù)必須具有一致的異常說明。
- 如果我們?yōu)槟硞€(gè)指針做了不拋出異常的聲明, 則該指針將只能指向不拋出異常的函數(shù)。
- 如果我們顯式或隱式地說明了指針可能拋出異常, 則該指針可以指向任何函數(shù), 即使是承諾了不拋出
異常的函數(shù)也可以
1.4.2 虛函數(shù)
如果一個(gè)虛函數(shù)承諾了它不會(huì)拋出異常,則它后續(xù)的派生類的虛函數(shù)也必須做出同樣的承諾。
如果基類的虛函數(shù)允許拋出異常時(shí),我們可以設(shè)置派生類對(duì)應(yīng)的函數(shù)不能拋出異常,當(dāng)然也可以是允許拋出異常
1.4.3 拷貝控制成員
- 當(dāng)編譯器合成拷貝控制成員時(shí),同時(shí)也生成一個(gè)異常說明符。
- 如果對(duì)所有成員和基類的所有操作都承諾了不會(huì)拋出異常,則合成的成員是noexcept的。
- 如果合成成員調(diào)用的任意一個(gè)函數(shù)可能會(huì)拋出異常,則合成的成員是noexcept(false)的。
-我們定義了一個(gè)析構(gòu)函數(shù),但是沒有為它提供異常說明,編譯器將會(huì)合成一個(gè),合成的異常說明符將與假設(shè)編譯器為類合成的析構(gòu)函數(shù)時(shí)所得的異常說明一致。
總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)noexcept的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha