C++11 关键字noexcept 替代 throw
相比于断言适用于排除逻辑上不可能存在的状态,异常通常是用于逻辑上可能发生的错误。
在异常处理的代码中,程序员有可能看到过如下的异常声明表达形式:
void excpt_func() throw(int, double) { ... }
在excpt_func函数声明之后,我们定义了一个动态异常声明throw(int, double),该声明指出了excpt_func可能抛出的异常的类型。事实上,该特性很少被使用,因此在C++11中被弃用了(参见附录B),而表示函数不会抛出异常的动态异常声明throw()也被新的noexcept异常声明所取代。
noexcept形如其名地,表示其修饰的函数不会抛出异常。不过与throw()动态异常声明不同的是,在C++11中如果noexcept修饰的函数抛出了异常,编译器可以选择直接调用std::terminate()函数来终止程序的运行,这比基于异常机制的throw()在效率上会高一些。这是因为异常机制会带来一些额外开销,比如函数抛出异常,会导致函数栈被依次地展开(unwind),并依帧调用在本帧中已构造的自动变量的析构函数等。
noexcept修饰符有两种形式,
一种就是简单地在函数声明后加上noexcept关键字。比如:void excpt_func() noexcept;
另外一种则可以接受一个常量表达式作为参数,如下所示:void excpt_func() noexcept (常量表达式);
常量表达式的结果会被转换成一个bool类型的值。该值为true,表示函数不会抛出异常,反之,则有可能抛出异常。这里,不带常量表达式的noexcept相当于声明了noexcept(true),即不会抛出异常。
在C++98中,new可能会包含一些抛出的std::bad_alloc异常。
void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw(std::bad_alloc);
而在C++11中,则使用noexcept(false)来进行替代。
void* operator new(std::size_t) noexcept(false);
void* operator new[](std::size_t) noexcept(false);
当然,noexcept更大的作用是保证应用程序的安全。比如一个类析构函数不应该抛出异常,那么对于常被析构函数调用的delete函数来说,C++11默认将delete函数设置成noexcept,就可以提高应用程序的安全性。
void operator delete(void*) noexcept;
void operator delete[](void*) noexcept;
而同样出于安全考虑,C++11标准中让类的析构函数默认也是noexcept(true)的
另外:
void fun (); // 能抛出任何类型的异常
void fun () throw(except1,except2,except3)
// 后面括号里面是一个异常参数表,本例中只能抛出这3中异常
void fun () throw() // 参数表为空,不能抛出异常
C++11 关键字noexcept 替代 throw相关推荐
- 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_ ...
- java异常处理机简答题,【简答题】JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally 分别代表什么意义?...
[简答题]JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally 分别代表什么意义? 更多相关问题 用蒸汽进行设备管线吹扫时,应将被吹扫的设备管线,相应 ...
- padding和卷积的区别_NiN:使用11卷积层替代全连接层
微信公号:ilulaoshi, 原文发表在我的个人网站:https://lulaoshi.info/machine-learning/convolutional/nin.html LeNet.Alex ...
- 11 款可替代 top 命令的工具!
作者 | JackTian 来源 | 杰哥的IT之旅 在 Linux 环境下 top 命令都不陌生,它以实时动态的方式查看系统的整体运行情况,综合了多方信息监测系统性能和运行信息的实用工具,通 ...
- [java进阶]4.关键字throws和throw
1. throws 关键字 throws关键字主要用于方法声明上,指的是当方法之中出现异常后交由被调用处处理. class MyMath{ //由于存在throws,那么就表示此方法里面产生的异常交给 ...
- C++11关键字constexpr看这篇就够了
一.在普通函数中的使用 例如下面的代码, 数组的大小必须是常量,在声明数组array时,用函数返回值,此时会报错: error C2131: 表达式的计算结果不是常数 note: 对未定义的函数或为未 ...
- JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?...
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类, 并提供了良好的 接口. 在 Java中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例.当一个方 ...
- C++11新特性学习
什么是C+11 C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming langu ...
最新文章
- 在线支付之风控系统架构选型
- lua 调用文件中的函数调用_四、C++获得Lua的变量和Table的值
- [09]CSS 边框与背景 (上)
- ubuntu修改ssh服务的端口号
- Android开发实践:常用NDK命令行参数
- 1.4 编程基础之逻辑表达式与条件分支
- mysql执行程序_Sql在Mysql的执行
- 在线JSON校验格式化工具(Be JSON)
- 心理学与生活-南京大学-陈昌凯-中国大学MOOC慕课-各章测试题答案
- 需求与商业模式创新-4-战略
- 具名元组namedtuple
- 激励帖 冲呀 dreamer
- 【面试心得】郑州卓见软件科技
- px 、 rem 、 vw学习
- 济南申报高企需要什么材料
- 7-209 sdut-C语言实验-数位数7-210 sdut-C语言实验-小树快长高
- python爱心表白_python爱心表白 每天都是浪漫七夕!
- 计算机网络,ping连接同一个WiFi的电脑,回复无法访问目标主机,但是数据包已接收(防火墙已关)
- 如何清除去掉PPT文字下的波浪线
- 机械毕业设计题目推荐,接近10万套,部分目录如下: