1 关键字noexcept

从C++11开始,我们能看到很多代码当中都有关键字noexcept。比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept。

      constexpr initializer_list() noexcept: _M_array(0), _M_len(0) { }

该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化。
如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会直接终止,调用std::terminate()函数,该函数内部会调用std::abort()终止程序。

2 C++的异常处理

C++中的异常处理是在运行时而不是编译时检测的。为了实现运行时检测,编译器创建额外的代码,然而这会妨碍程序优化。
在实践中,一般两种异常抛出方式是常用的:

  • 一个操作或者函数可能会抛出一个异常;
  • 一个操作或者函数不可能抛出任何异常。

后面这一种方式中在以往的C++版本中常用throw()表示,在C++ 11中已经被noexcept代替。

    void swap(Type& x, Type& y) throw()   //C++11之前{x.swap(y);}void swap(Type& x, Type& y) noexcept  //C++11{x.swap(y);}

3 有条件的noexcecpt

在第2节中单独使用noexcept,表示其所限定的swap函数绝对不发生异常。然而,使用方式可以更加灵活,表明在一定条件下不发生异常。

    void swap(Type& x, Type& y) noexcept(noexcept(x.swap(y)))    //C++11{x.swap(y);}

它表示,如果操作x.swap(y)不发生异常,那么函数swap(Type& x, Type& y)一定不发生异常。

一个更好的示例是std::pair中的移动分配函数(move assignment),它表明,如果类型T1和T2的移动分配(move assign)过程中不发生异常,那么该移动构造函数就不会发生异常。

    pair& operator=(pair&& __p)noexcept(__and_<is_nothrow_move_assignable<_T1>,is_nothrow_move_assignable<_T2>>::value){first = std::forward<first_type>(__p.first);second = std::forward<second_type>(__p.second);return *this;}

4 什么时候该使用noexcept?

使用noexcept表明函数或操作不会发生异常,会给编译器更大的优化空间。然而,并不是加上noexcept就能提高效率,步子迈大了也容易扯着蛋。
以下情形鼓励使用noexcept:

  • 移动构造函数(move constructor)
  • 移动分配函数(move assignment)
  • 析构函数(destructor)。这里提一句,在新版本的编译器中,析构函数是默认加上关键字noexcept的。下面代码可以检测编译器是否给析构函数加上关键字noexcept。
    struct X{~X() { };};int main(){X x;// This will not fire even in GCC 4.7.2 if the destructor is// explicitly marked as noexcept(true)static_assert(noexcept(x.~X()), "Ouch!");}
  • 叶子函数(Leaf Function)。叶子函数是指在函数内部不分配栈空间,也不调用其它函数,也不存储非易失性寄存器,也不处理异常。

最后强调一句,在不是以上情况或者没把握的情况下,不要轻易使用noexception。

C++11 关键字noexcept相关推荐

  1. C++11 新特性 —— 关键字noexcept

    转载;https://www.cnblogs.com/sword03/p/10020344.html 1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比 ...

  2. 【C++基础】C++11的noexcept声明符 与 异常传播

    目录 C++ noexcept: 1.用途 2.用法 1.noexcept声明符的用法: 2.noexcept运算符的用法 异常传播 1.异常传播的定义 2.异常传播中的规则 3.异常传播的代价 C+ ...

  3. 第一篇:C++11关键字

    C++11 关键字共73个. 新增关键字: alignas.alignof.char16_t.char32_t.constexpr.decltype. noexcept.nullptr.static_ ...

  4. C++11关键字constexpr看这篇就够了

    一.在普通函数中的使用 例如下面的代码, 数组的大小必须是常量,在声明数组array时,用函数返回值,此时会报错: error C2131: 表达式的计算结果不是常数 note: 对未定义的函数或为未 ...

  5. Qt源码剖析-智能指针

    目录 智能指针是什么? 为什么使用QT智能(smart)指针? Qt提供了哪些智能指针? QSharedPointer类模板(smart指针类)源码分析 1. QSharedPointer类模板对于模 ...

  6. 【C++】C++11新增关键字详解

    目录 一.auto 1.auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2.auto用于推断变量类型示例(C++11) 3.声明或定义函数时作为函数返回值的占位符,此时需要与关键字 d ...

  7. C++11 新关键字

    文章目录 1.auto 1.1 用法示例 2.using 3.decltype 3.1 decltype 推导规则 3.2 用法示例 4.nullptr_t 与 nullptr 5.constexpr ...

  8. C++/C++11中std::runtime_error的使用

    std::runtime_error:运行时错误异常类,只有在运行时才能检测到的错误,继承于std::exception,它的声明在头文件<stdexcept>中.std::runtime ...

  9. C++/C++11中std::exception的使用

    std::exception:标准异常类的基类,其类的声明在头文件<exception>中.所有标准库的异常类均继承于此类,因此通过引用类型可以捕获所有标准异常. std::excepti ...

  10. C++11语言新特性-《C++标准库(第二版)》读书笔记

    文章目录 3.1.1 微小但重要的语法提升 Template 表达式内的空格 nullptr 和std::nullptr_t 3.1.2 以auto 完成自动类型推导 3.1.3 一致性初始化(Uni ...

最新文章

  1. Blender 3.0机器人硬面建模材质渲染全流程学习课程
  2. R可视化绘制指数分布(Exponential Distribution)
  3. 中兴f477v2超级管理员_中兴F650光猫修复
  4. “网工”可以跳越“网管”吗?
  5. java后台验证不能为空_java validation 后台参数验证的使用详解
  6. python视频编辑过场动画_视频剪辑什么鬼?Python 带你高效创作短视频
  7. cpu序列号唯一吗_怎么看电脑硬件是不是新的 有什么软件能检测吗?
  8. 自己实现一个右滑删除的ListView
  9. 用户界面之工具栏详解-AutoRunner自动化测试工具
  10. 让Excel窗口保持在所有窗口前面
  11. 1. 数理统计---数理统计基本概念
  12. 太极图形html5代码,太极图案用html5怎样
  13. jena 查询 java_Jena搭建SPARQL查询RDF数据
  14. C#:控制台数绵羊小程序
  15. Redis(六)Java连接Redis
  16. 2023内蒙古大学计算机考研信息汇总
  17. RBP系统管理之日志管理
  18. 艺赛旗(PRA)根据制式模板批量生成 word 文件
  19. 安信可 ESP8266 12F Flash操作
  20. 占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题

热门文章

  1. android java调用js方法参数_android中利用webview调用网页上的js代码 Java代码调用js并传递参数...
  2. java中的时间片概念_java中常用的时间处理类TimeUtil
  3. Path接口与Files工具类
  4. linux zk服务 关闭_linux上安装zookeeper 启动和关闭的教程
  5. Docker从理论到实践(二)------配置Docker镜像源加速器(部分使用效果已不太理想)
  6. 汇编:call和jmp
  7. Inferred type 'S' for type parameter 'S' is not within its bound;
  8. 读取Flash w25x64未响应 导致卡死的问题
  9. HTML5权威指南 6.多媒体相关API
  10. JZOJ 4.2 C组 打鼹鼠