JoeChenzzz

导航

noexcept(c++11)

1.概念

1)c++中的异常处理是在运行时而不是编译时检测的,为了实现运行时检测,编译器可能会创建额外的异常处理代码,然而这会妨碍程序优化

2)noexcept说明符:若修饰函数(紧跟在参数列表后面),则意为承诺编译器这个函数不抛出任何异常

3)C++11之前使用throw()来指明某个函数不会抛出异常

void fun() throw()   //C++11之前使用throw()来指明某个函数不会抛出异常
{
    cout << 666 << endl;
}

void fun11() noexcept  //C++11使用noexcept来指明某个函数不会抛出异常
{
    cout << 777 << endl;
}

4)编译器看到这个承诺,就不会创建额外的异常处理代码,程序得到优化

5)noexcept说明符接受一个可选的实参,该实参为bool型。若为true,则承诺这个函数不会抛出异常;若为false,则承诺这个函数可能抛出异常

void recoup(int) noexcept(true);
void recoup(int) noexcept(false);

6)以下情形鼓励使用noexcept:

  • 移动构造函数(move constructor)
  • 析构函数(destructor):在新版本的编译器中,析构函数是默认加上关键字noexcept的
  • 在不是以上情况或者没把握的情况下,不要轻易使用noexcept

7)noexcept运算符:用于判断给定的的表达式是否会抛出异常,返回一个bool型右值常量表达式,调用形式为:noexcept(表达式)

noexcept(recoup(5));//若recoup(5)不抛出异常则返回true,抛出异常返回false

参考资料:

https://www.cnblogs.com/sword03/p/10020344.html

posted on 2018-09-26 14:38  JoeChenzzz  阅读(500)  评论(0编辑  收藏  举报