網站首頁 編程語言 正文
c++11中noexcept關鍵字
1. 概念
noexcept關鍵字是c++11之后新增的。該關鍵字會告訴編譯器,被修飾的函數不會發生異常,這有利于編譯器對程序做更多的優化。
2. 兩種形式
1)noexcept
2)noexcept(expression)
noexcept(true) 表示被修飾的函數不拋出異常,noexcept(false) 表示被修飾的函數會拋出異常。
3. 異常處理
//例1
bool Compare(int x, int y) throw() ? //C++11之前
{
?? ?return x > y;
}
?
//例2
bool Compare(int x, int y) noexcept(noexcept(x > y)) ?//C++11
{
?? ?return x > y;
}
例2用到了noexcept運算符,表示,如果x > y不發生異常,則Compare函數不會發生異常。
4. 實現原理
noexecpt函數向外拋出了異常(如果函數內部捕捉了異常并完成處理,這種情況不算拋出異常),程序會直接終止,調用std::terminate()函數,該函數內部會調用std::abort()終止程序。
5. 使用場景
1)移動構造函數
2)移動分配函數
3)析構函數
4)葉子函數
c++11關鍵字noexcept替代throw
相比于斷言適用于排除邏輯上不可能存在的狀態,異常通常是用于邏輯上可能發生的錯誤。
在異常處理的代碼中,程序員有可能看到過如下的異常聲明表達形式:
void excpt_func() throw(int, double) { ... }
在excpt_func函數聲明之后,我們定義了一個動態異常聲明throw(int, double),該聲明指出了excpt_func可能拋出的異常的類型。事實上,該特性很少被使用,因此在C++11中被棄用了(參見附錄B),而表示函數不會拋出異常的動態異常聲明throw()也被新的noexcept異常聲明所取代。
noexcept形如其名地,表示其修飾的函數不會拋出異常。不過與throw()動態異常聲明不同的是,在C++11中如果noexcept修飾的函數拋出了異常,編譯器可以選擇直接調用std::terminate()函數來終止程序的運行,這比基于異常機制的throw()在效率上會高一些。這是因為異常機制會帶來一些額外開銷,比如函數拋出異常,會導致函數棧被依次地展開(unwind),并依幀調用在本幀中已構造的自動變量的析構函數等。
noexcept修飾符有兩種形式
- 一種就是簡單地在函數聲明后加上noexcept關鍵字。比如:void excpt_func() noexcept;?
- 另外一種則可以接受一個常量表達式作為參數,如下所示:void excpt_func() noexcept (常量表達式);?
常量表達式的結果會被轉換成一個bool類型的值。該值為true,表示函數不會拋出異常,反之,則有可能拋出異常。這里,不帶常量表達式的noexcept相當于聲明了noexcept(true),即不會拋出異常。
在C++98中,new可能會包含一些拋出的std::bad_alloc異常。
void* operator new(std::size_t) throw(std::bad_alloc); ?
void* operator new[](std::size_t) throw(std::bad_alloc); ?
而在C++11中,則使用noexcept(false)來進行替代。 ?
void* operator new(std::size_t) noexcept(false);
void* operator new[](std::size_t) noexcept(false); ?
當然,noexcept更大的作用是保證應用程序的安全。比如一個類析構函數不應該拋出異常,那么對于常被析構函數調用的delete函數來說,C++11默認將delete函數設置成noexcept,就可以提高應用程序的安全性。?
void operator delete(void*) noexcept;
void operator delete[](void*) noexcept; ?
而同樣出于安全考慮,C++11標準中讓類的析構函數默認也是noexcept(true)的
另外:
void fun (); // 能拋出任何類型的異常
void fun () throw(except1,except2,except3) // 后面括號里面是一個異常參數表,本例中只能拋出這3中異常
void fun () throw() ? // 參數表為空,不能拋出異常
原文鏈接:https://blog.csdn.net/www_dong/article/details/113485996
相關推薦
- 2022-12-02 React函數式組件Hook中的useEffect函數的詳細解析_React
- 2022-04-04 webpack-loader: url-loader
- 2022-11-18 python標準庫?datetime的astimezone設置時區遇到的坑及解決_python
- 2022-09-18 Golang實現文件傳輸功能_Golang
- 2022-05-26 Flutter自定義年月日倒計時_Android
- 2022-05-09 Golang中Map按照Value大小排序的方法實例_Golang
- 2022-09-10 python中的隨機數種子seed()用法說明_python
- 2022-10-27 python使用pika庫調用rabbitmq交換機模式詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支