C++11 新特性 —— 关键字noexcept
转载;https://www.cnblogs.com/sword03/p/10020344.html
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新特性之auto关键字的使用
一.auto关键字简介 auto这个关键字并不是一个全新的关键字,在旧标准中,它代表的是"具有自动存储期的局部变量":但是它在这方面并没有起到很大的作用,比如:auto int i ...
- C++11 新特性简介
1.auto auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用.在C++11中被赋予了新的含义和作用,用于类型推断. auto关键字主要有两种用途:一是在变量 ...
- C++11新特性选讲 语言部分 侯捷
C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...
- C++11新特性之新类型与初始化
C++11新特性之新类型与初始化 snoone | 2016-06-23 11:57 浏览量(148) 评论(0) 推荐(0) 数据 这是C++11新特性介绍的第一部分,比较简单易懂, ...
- 深入浅出之C++11新特性
1. auto类型赋予新含义 1.1 auto类型定义 在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的,这也是编译 ...
- 《深入理解C++11:C++ 11新特性解析与应用》——导读
前 言 为什么要写这本书 相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了.而上一次标准制定,正是面向对象概念开始盛行的时候.较之基于过程的编程语言,基于面向对象.泛型编程等概念的C ...
- C++11新特性的总结
C++11新特性 auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11) C++动态内存管理 序列式容器 array forward_list; 继承和 ...
- C++11新特性以及std::thread多线程编程
一 .C++11新特性 1. auto 类型推导 1.1 当=号右边的表达式是一个引用类型时,auto会把引用抛弃,直接推导出原始类型: 1.2 当=号右边的表达式带有const属性时,auto不会使 ...
- C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性
C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...
最新文章
- Android 多媒体综述
- axios解决调用后端接口跨域问题
- nmake构建Geos库
- 6、HTML有序列表+无序列表+定义列表
- QDoc支持衍生项目
- Alteral Max 10 FPGA 优点
- 在普通类中调用service
- pandas 判断是否等于nan_Python之pandas笔记
- 无法运行的愿意_分享减肥食谱一周瘦10斤,你愿意尝试吗?
- jps后发现DataNode没有启动
- 【李宏毅2020 ML/DL】P26-33 Explainable ML
- 推荐一下干货-------为什么你的app不耐看
- latex模板——计算机学报
- js处理的8种跨域方法
- google 浏览器 常用插件
- 从小白到Python大神只需要100天
- linux ssh motd 颜色,ubuntu ssh登录的时候motd被打印了两次
- Chrome游览器下载
- 2022网易最新版本将军令算法刨析(2)
- SWFObject是什么
热门文章
- HaProxy+Keepalived+Mycat高可用群集配置
- c# Ftp下载程序源代码解析
- Oracle Class4. 数据库对象(同义词,序列,视图,索引,簇)
- 面向对象方法开发的方法
- linux无法访问443端口,linux – 为什么我无法在Ubuntu上ping端口443?
- opencv安装教程python3.7_Mac下安装使用Python-OpenCV,解决opencv3安装完成无法使用的问题 - pytorch中文网...
- python有多少种模块_python如何查看有哪些模块
- self 实例对象-代码详细解释
- Python基础总结之常用内置方法总结
- 关于android开发时,发生Error infalting classa com.baidu.mapapi.map.MapView的解决办法