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()))
{
...
}
三.推荐使用情况
-
移动构造函数
-
移动分配函数
-
析构函数
c++11后,默认析构带
noexcept
关键字;如果析构,加
noexcept(false)
则可以抛出异常; -
叶子函数
Life is too short for so much sorrow.
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自 小紫苏!