c11中noexcept关键字1. 概念noexcept关键字是c11之后新增的。该关键字会告诉编译器被修饰的函数不会发生异常,这有利于编译器对程序做更多的优化。2. 两种形式1noexcept2noexcept(expression)noexcept(true) 表示被修饰的函数不抛出异常noexcept(false) 表示被修饰的函数会抛出异常。3. 异常处理1234567891011//例1boolCompare(intx,inty)throw()//C11之前{returnx y;}//例2boolCompare(intx,inty) noexcept(noexcept(x y))//C11{returnx y;}例2用到了noexcept运算符表示如果x y不发生异常则Compare函数不会发生异常。4. 实现原理noexecpt函数向外抛出了异常如果函数内部捕捉了异常并完成处理这种情况不算抛出异常程序会直接终止调用std::terminate()函数该函数内部会调用std::abort()终止程序。5. 使用场景1移动构造函数2移动分配函数3析构函数4叶子函数c11关键字noexcept替代throw相比于断言适用于排除逻辑上不可能存在的状态异常通常是用于逻辑上可能发生的错误。在异常处理的代码中程序员有可能看到过如下的异常声明表达形式1voidexcpt_func()throw(int,double) { ... }在excpt_func函数声明之后我们定义了一个动态异常声明throw(int, double)该声明指出了excpt_func可能抛出的异常的类型。事实上该特性很少被使用因此在C11中被弃用了参见附录B而表示函数不会抛出异常的动态异常声明throw()也被新的noexcept异常声明所取代。noexcept形如其名地表示其修饰的函数不会抛出异常。不过与throw()动态异常声明不同的是在C11中如果noexcept修饰的函数抛出了异常编译器可以选择直接调用std::terminate()函数来终止程序的运行这比基于异常机制的throw()在效率上会高一些。这是因为异常机制会带来一些额外开销比如函数抛出异常会导致函数栈被依次地展开unwind并依帧调用在本帧中已构造的自动变量的析构函数等。noexcept修饰符有两种形式一种就是简单地在函数声明后加上noexcept关键字。比如void excpt_func() noexcept;另外一种则可以接受一个常量表达式作为参数如下所示void excpt_func() noexcept (常量表达式);常量表达式的结果会被转换成一个bool类型的值。该值为true表示函数不会抛出异常反之则有可能抛出异常。这里不带常量表达式的noexcept相当于声明了noexcept(true)即不会抛出异常。在C98中new可能会包含一些抛出的std::bad_alloc异常。12void* operatornew(std::size_t)throw(std::bad_alloc);void* operatornew[](std::size_t)throw(std::bad_alloc);而在C11中则使用noexcept(false)来进行替代。12void* operatornew(std::size_t) noexcept(false);void* operatornew[](std::size_t) noexcept(false);当然noexcept更大的作用是保证应用程序的安全。比如一个类析构函数不应该抛出异常那么对于常被析构函数调用的delete函数来说C11默认将delete函数设置成noexcept就可以提高应用程序的安全性。12voidoperatordelete(void*) noexcept;voidoperatordelete[](void*) noexcept;而同样出于安全考虑C11标准中让类的析构函数默认也是noexcept(true)的另外123voidfun ();// 能抛出任何类型的异常voidfun ()throw(except1,except2,except3)// 后面括号里面是一个异常参数表本例中只能抛出这3中异常voidfun ()throw()// 参数表为空不能抛出异常以上为个人经验希望能给大家一个参考