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 @ 2021-10-03 18:19  小紫苏  阅读(506)  评论(0编辑  收藏  举报