相比于断言适用于排除逻辑上不可能存在的状态,异常通常是用于逻辑上可能发生的错误。

在异常处理的代码中,程序员有可能看到过如下的异常声明表达形式:

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相关推荐

  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. java异常处理机简答题,【简答题】JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally 分别代表什么意义?...

    [简答题]JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally 分别代表什么意义? 更多相关问题 用蒸汽进行设备管线吹扫时,应将被吹扫的设备管线,相应 ...

  5. padding和卷积的区别_NiN:使用11卷积层替代全连接层

    微信公号:ilulaoshi, 原文发表在我的个人网站:https://lulaoshi.info/machine-learning/convolutional/nin.html LeNet.Alex ...

  6. 11 款可替代 top 命令的工具!

    ‍ ‍ 作者 | JackTian 来源 | 杰哥的IT之旅 在 Linux 环境下 top 命令都不陌生,它以实时动态的方式查看系统的整体运行情况,综合了多方信息监测系统性能和运行信息的实用工具,通 ...

  7. [java进阶]4.关键字throws和throw

    1. throws 关键字 throws关键字主要用于方法声明上,指的是当方法之中出现异常后交由被调用处处理. class MyMath{ //由于存在throws,那么就表示此方法里面产生的异常交给 ...

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

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

  9. JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?...

    Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类, 并提供了良好的 接口.         在 Java中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例.当一个方 ...

  10. C++11新特性学习

    什么是C+11 C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming langu ...

最新文章

  1. 在线支付之风控系统架构选型
  2. lua 调用文件中的函数调用_四、C++获得Lua的变量和Table的值
  3. [09]CSS 边框与背景 (上)
  4. ubuntu修改ssh服务的端口号
  5. Android开发实践:常用NDK命令行参数
  6. 1.4 编程基础之逻辑表达式与条件分支
  7. mysql执行程序_Sql在Mysql的执行
  8. 在线JSON校验格式化工具(Be JSON)
  9. 心理学与生活-南京大学-陈昌凯-中国大学MOOC慕课-各章测试题答案
  10. 需求与商业模式创新-4-战略
  11. 具名元组namedtuple
  12. 激励帖 冲呀 dreamer
  13. 【面试心得】郑州卓见软件科技
  14. px 、 rem 、 vw学习
  15. 济南申报高企需要什么材料
  16. 7-209 sdut-C语言实验-数位数7-210 sdut-C语言实验-小树快长高
  17. python爱心表白_python爱心表白 每天都是浪漫七夕!
  18. 计算机网络,ping连接同一个WiFi的电脑,回复无法访问目标主机,但是数据包已接收(防火墙已关)
  19. 如何清除去掉PPT文字下的波浪线
  20. 机械毕业设计题目推荐,接近10万套,部分目录如下:

热门文章

  1. 更改ESXi主机root用户密码
  2. horizontalscrollview+textview简单版
  3. The partial sum problem
  4. hibernate(二)annotation第一个示例
  5. 为安装有系统及应用程序的服务器更换硬盘方法一例
  6. 停止标记NYOJ 一个简单的数学题 南工330停止标记
  7. SQL Server数据行的物理空间分配
  8. 小程序自定义tabBar(类似咸鱼)
  9. winform耗时代码处理,仿win10加载动画Loading(等待界面)
  10. c# 如何获取项目的根目录