C++标准学习--noexcept

本文系转载,原文链接:https://blog.csdn.net/XiaoH0_0/article/details/110649313

简介:
noexcept关键字,说明函数不会抛出任何异常,如果该函数在运行过程中违反了noexcept约定,试图抛出异常,C++会调用std::terminate函数终止程序运行。

noexcept优缺点:

优点:
1.调用noexcept函数时不需要记录exception handler,所以编译器有更高的自由度,提升了生成更加高效的执行代码的可能性;
2.确保代码中不使用throw和try…catch的方式在函数执行过程中抛出异常。而是通过函数返回值和出参的方式返回异常,在外部显式的处理异常。使用一套异常处理机制,确保每个异常都在代码中都进行显式的处理。

缺点:
1.noexcept会影响接口的灵活性,比如基类某个虚函数设置为noexcept,派生类覆盖虚函数时也必须遵守,派生类中只要有一个函数遗漏了noexcept约定,就会导致整个程序在完全没有必要终止的情况下被终止。
2.对于使用了第三方库的软件,想要使用noexcept关键字来修饰每个非虚函数,就需要对每个第三方库都做一层封装,确保处理了第三方库所有可能抛出的异常,而如果不使用noexcept关键字,异常可以向上传递,统一在一个点处理异常;
3.如果想要通过noexcept来提升性能,那么依赖的libc++等底层库需要也都使用noexcept的版本进行编译,因为函数调用越频繁,noexcept的收益就越大;

noexcept几个特性:

如果一个函数中调用的其他函数都为noexcept,即便这个函数未声明为noexcept,也具有noexcept的效果;
如果一个noexcept函数中,抛出了异常,则程序直接在函数异常处终止,函数外部的资源不会显式的释放;
所有的函数,默认都是noexcept(false)的,noexcept的函数, 需要手工添加;
4.编译器能够推导生成析构函数,move构造和赋值运算符的noexcept属性,因为这些函数使用noexcept是必须的,没有任何负收益。即以上这些函数即便不添加noexcept关键字,实际也是noexcept的
但仍然建议显式的在这些函数后添加noexcept关键字,主要从可读性角度考虑;
noexcept其他用法:
1.判断一个函数是否为noexcept,可以使用noexcept操作符(这既是一个关键字,也是一个操作符),可以用cout输出结果;
2.noexcept作为操作符,可以计算常量表达式,在编译期间,决定一个函数是否为noexcept,关键字noexcept等价于操作符的noexcept(true);

比如如下代码:

void checkexcept() noexcept
{
        printf("enter subcall\n");
        throw 4;
        printf("return from subcall\n");
}
int main()
{
        checkexcept();
        return 0;
}
执行会产生如下提示:

你可能感兴趣的:(c++,学习)