[C++] noexcept关键字简介

  • 简介:
    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几个特性:

  1. 如果一个函数中调用的其他函数都为noexcept,即便这个函数未声明为noexcept,也具有noexcept的效果;
  2. 如果一个noexcept函数中,抛出了异常,则程序直接在函数异常处终止,函数外部的资源不会显式的释放;
  3. 所有的函数,默认都是noexcept(false)的,noexcept的函数, 需要手工添加;
    4.编译器能够推导生成析构函数,move构造和赋值运算符的noexcept属性,因为这些函数使用noexcept是必须的,没有任何负收益。即以上这些函数即便不添加noexcept关键字,实际也是noexcept的
    但仍然建议显式的在这些函数后添加noexcept关键字,主要从可读性角度考虑;
  • noexcept其他用法:
    1.判断一个函数是否为noexcept,可以使用noexcept操作符(这既是一个关键字,也是一个操作符),可以用cout输出结果;
    2.noexcept作为操作符,可以计算常量表达式,在编译期间,决定一个函数是否为noexcept,关键字noexcept等价于操作符的noexcept(true);
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
noexcept关键字C++11中引入的,用于指明某个函数不会抛出异常。在函数声明或定义时使用noexcept关键字可以明确表示该函数不会抛出任何异常。noexcept关键字有两种形式,一种是直接在函数声明后加上noexcept关键字,例如"void test() noexcept;",另一种是使用noexcept作为操作符,通常用于模板。例如"template <class T> void fun() noexcept(noexcept(T())) {}"。 使用noexcept关键字可以提供更好的代码可读性和性能优化。在函数声明或定义中使用noexcept关键字可以帮助程序员更加清晰地了解函数的异常安全性,并在编译时进行一些优化。当一个函数被声明为noexcept时,编译器可以在编译时对其进行一些优化,提高代码的执行效率。 需要注意的是,noexcept并不会禁止函数抛出异常,而是用来明确表示函数不会抛出异常。如果一个被声明为noexcept的函数在运行时抛出异常,程序将会终止。因此,在使用noexcept关键字时要确保函数的实现没有抛出异常的可能性。 总之,noexcept关键字C++11引入的用于指明某个函数不会抛出异常的关键字,可以提高代码的可读性和性能优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [c++中的noexcept 关键字](https://blog.csdn.net/weixin_68294039/article/details/127023089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++ vector扩容解析noexcept应用场景](https://download.csdn.net/download/weixin_38514805/13707167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值