C++11 关键字noexcept
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相关推荐
- C++11 新特性 —— 关键字noexcept
转载;https://www.cnblogs.com/sword03/p/10020344.html 1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比 ...
- 【C++基础】C++11的noexcept声明符 与 异常传播
目录 C++ noexcept: 1.用途 2.用法 1.noexcept声明符的用法: 2.noexcept运算符的用法 异常传播 1.异常传播的定义 2.异常传播中的规则 3.异常传播的代价 C+ ...
- 第一篇:C++11关键字
C++11 关键字共73个. 新增关键字: alignas.alignof.char16_t.char32_t.constexpr.decltype. noexcept.nullptr.static_ ...
- C++11关键字constexpr看这篇就够了
一.在普通函数中的使用 例如下面的代码, 数组的大小必须是常量,在声明数组array时,用函数返回值,此时会报错: error C2131: 表达式的计算结果不是常数 note: 对未定义的函数或为未 ...
- Qt源码剖析-智能指针
目录 智能指针是什么? 为什么使用QT智能(smart)指针? Qt提供了哪些智能指针? QSharedPointer类模板(smart指针类)源码分析 1. QSharedPointer类模板对于模 ...
- 【C++】C++11新增关键字详解
目录 一.auto 1.auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2.auto用于推断变量类型示例(C++11) 3.声明或定义函数时作为函数返回值的占位符,此时需要与关键字 d ...
- C++11 新关键字
文章目录 1.auto 1.1 用法示例 2.using 3.decltype 3.1 decltype 推导规则 3.2 用法示例 4.nullptr_t 与 nullptr 5.constexpr ...
- C++/C++11中std::runtime_error的使用
std::runtime_error:运行时错误异常类,只有在运行时才能检测到的错误,继承于std::exception,它的声明在头文件<stdexcept>中.std::runtime ...
- C++/C++11中std::exception的使用
std::exception:标准异常类的基类,其类的声明在头文件<exception>中.所有标准库的异常类均继承于此类,因此通过引用类型可以捕获所有标准异常. std::excepti ...
- C++11语言新特性-《C++标准库(第二版)》读书笔记
文章目录 3.1.1 微小但重要的语法提升 Template 表达式内的空格 nullptr 和std::nullptr_t 3.1.2 以auto 完成自动类型推导 3.1.3 一致性初始化(Uni ...
最新文章
- Blender 3.0机器人硬面建模材质渲染全流程学习课程
- R可视化绘制指数分布(Exponential Distribution)
- 中兴f477v2超级管理员_中兴F650光猫修复
- “网工”可以跳越“网管”吗?
- java后台验证不能为空_java validation 后台参数验证的使用详解
- python视频编辑过场动画_视频剪辑什么鬼?Python 带你高效创作短视频
- cpu序列号唯一吗_怎么看电脑硬件是不是新的 有什么软件能检测吗?
- 自己实现一个右滑删除的ListView
- 用户界面之工具栏详解-AutoRunner自动化测试工具
- 让Excel窗口保持在所有窗口前面
- 1. 数理统计---数理统计基本概念
- 太极图形html5代码,太极图案用html5怎样
- jena 查询 java_Jena搭建SPARQL查询RDF数据
- C#:控制台数绵羊小程序
- Redis(六)Java连接Redis
- 2023内蒙古大学计算机考研信息汇总
- RBP系统管理之日志管理
- 艺赛旗(PRA)根据制式模板批量生成 word 文件
- 安信可 ESP8266 12F Flash操作
- 占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题
热门文章
- android java调用js方法参数_android中利用webview调用网页上的js代码 Java代码调用js并传递参数...
- java中的时间片概念_java中常用的时间处理类TimeUtil
- Path接口与Files工具类
- linux zk服务 关闭_linux上安装zookeeper 启动和关闭的教程
- Docker从理论到实践(二)------配置Docker镜像源加速器(部分使用效果已不太理想)
- 汇编:call和jmp
- Inferred type 'S' for type parameter 'S' is not within its bound;
- 读取Flash w25x64未响应 导致卡死的问题
- HTML5权威指南 6.多媒体相关API
- JZOJ 4.2 C组 打鼹鼠