C++关键字noexcept

关键字noexcept

一.解释

c++11新特性,函数加上改关键字,告诉编译器,函数不会发生异常,有利于编译器对程序的优化;

可以做为函数声明符的一部分出现(实现有noexcept ,声明不带noexcept会报错);

typedef不可用;

void f ( )  noexcept;  					        // 函数 f() 不会抛出
void  ( * fp ) ( )  noexcept ( false );  	                // fp 指向一个可能抛出
void g ( void pfa ( )  noexcept ) 的函数;                       // g 接受一个指向不抛出的函数的指针
// typedef int (*pf)() noexcept; 			        // 错误

c++中可能抛出异常的函数:

  • 使用非空动态异常规范声明的函数(直到 C++17,throw());
  • 不带noexcept说明符声明的函数,除了析构,构造,同类赋值,比较运算符重载,分配函数;

noexcept的函数重载时也不必须带相同的异常规范;

二.noexcept使用

void func() noexcept;				//该函数不会发生异常
void func() noexcept(false);		        //可能发生异常——一般可以不写

//配合模板使用
template <class T>
//由T()表达式是否会抛出异常决定fun()是否会抛出异常
void fun() noexcept(noexcept(T()))
{
    ...
}

三.推荐使用情况

  1. 移动构造函数

  2. 移动分配函数

  3. 析构函数

    c++11后,默认析构带noexcept关键字;

    如果析构,加noexcept(false)则可以抛出异常;

  4. 叶子函数

posted @   小紫苏  阅读(551)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示