目的:表示其修饰的函数不会抛出异常,编译器可以选择直接调用std::terminate()函数来终止程序的运行。
从语法上将,noexcept修饰符有两种形式,一种就是简单地在函数声明后加上noexcept关键字。比如:
void except_func() noexcept;
另外一种则可以接受一个常量表达式作为参数,如下所示:
void except_func() noexcept (常量表达式);
常量表达式的结果会被转换成一个bool类型的值。true代表不抛出异常,false则抛出异常。
而noexcept作为一个操作符时,通常可以用于模板。比如:
template <class T>
void fun() noexcept(noexept(T())){}
这里的第二个noexcept就是一个noexcept操作符。当其参数是一个有可能抛出异常的表达式的时候,返回值为false,否则为true。
虽然noexcept修饰的函数通过std::terminate的调用来结束程序的执行可能会带来很多问题,比如无法保证对象的析构函数的正常调用,无法保证栈的自动释放等。但是,这种“暴力”的方法,可以有效的保证应用程序的安全,比如一个类的析构函数不应该抛出异常,那么对于常被析构函数调用的delete函数来说,C++11默认将delete函数设置成noexcept。