当前位置: 首页 > 知识库问答 >
问题:

C 03 throw() 说明符 C 11 noexcept 之间的区别

钱欣悦
2023-03-14

throw() 和 no除了分别在运行时和编译时检查之外,还有什么区别吗?

这篇Wikipedia C 11文章建议弃用C 03抛出说明符。
为什么是这样,no的能力足以在编译时涵盖所有这些吗?

[注意:我检查了这个问题和这篇文章,但无法确定弃用的确切原因。

共有3个答案

刘向阳
2023-03-14

当违反动态异常规范时,C 运行时会调用 std::unexpected():从异常规范禁止此类型异常的函数引发异常。

std::意外()也可以直接从程序中调用。

在这两种情况下,std::unexpected调用当前安装的td::unxpected_handler。默认的std::expected_handler调用std::terminate

颜欣怡
2023-03-14

no的在编译时不检查。

实现不应仅仅因为表达式在执行时会引发或可能引发包含函数不允许的异常而拒绝表达式。

当声明为< code>noexcept或< code>throw()的函数试图抛出异常时,唯一的区别是一个调用< code>terminate,另一个调用< code>unexpected,后一种异常处理方式实际上已被弃用。

沈俊晤
2023-03-14

异常说明符已被弃用,因为异常说明符通常是一个糟糕的想法<添加code>noexcept是因为它是异常说明符的一个合理有用的用法:知道函数何时不会抛出异常。因此,它变成了一个二进制选择:将抛出的函数和不抛出的函数。

添加了noexcept,而不是删除除throw()之外的所有throw说明符,因为noexcept更强大noexcept可以有一个编译时解析为布尔值的参数。如果布尔值为真,则noexcept将继续。如果布尔值为false,则noexcept不会出现,函数可能会抛出。

因此,您可以这样做:

struct<typename T>
{
  void CreateOtherClass() { T t{}; }
};

如果T的默认构造函数可以,Create其他类会抛出异常吗?我们怎么知道?像这样:

struct<typename T>
{
  void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};

因此,Create其他类()将抛出给定类型的默认构造函数抛出。这修复了异常说明符的主要问题之一:它们无法向上传播调用堆栈。

您不能使用throw()来执行此操作。

 类似资料:
  • 问题内容: 我正在尝试学习Java,当我经过访问说明符时,我对此表示怀疑。如果未指定默认值,则默认值与java中的受保护访问说明符有什么区别? 问题答案: 该说明符允许所涉及类的所有子类访问它们,无论它们驻留在什么包中,以及同一包中的其他代码。默认说明符允许同一程序包中的其他代码访问,但不允许位于不同程序包中的子类中的代码访问。参见Java语言规范6.6节。 编辑:根据MichaelSchmeiß

  • 本文向大家介绍说明TDD和BDD之间的差异。,包括了说明TDD和BDD之间的差异。的使用技巧和注意事项,需要的朋友参考一下 下面列出了测试驱动开发(TDD)和行为驱动框架(BDD)之间的区别- Sl编号 TDD BDD 这是由开发人员驱动的。 2 这主要集中在应用程序功能的编码实现上。 3 这主要用于单元测试。 4 流行使用的工具是JDave,SpecFlow等。 5 TDD被称为“测试驱动开发”

  • 问题内容: “ Prepared Statement”是Statement的稍强版本,并且应始终至少与Statement一样快捷且易于处理。 准备好的语句可能已参数化 大多数关系数据库通过四个步骤来处理JDBC / SQL查询: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取并返回数据 对于发送到数据库的每个SQL查询,一个Statement将始终执行上述四个步

  • 本文向大家介绍Java中受保护的访问说明符和默认的访问说明符有什么区别?,包括了Java中受保护的访问说明符和默认的访问说明符有什么区别?的使用技巧和注意事项,需要的朋友参考一下 受保护的 访问说明符是相同的封装内可见,并且还在子类中可见,而默认 为一个 包级别的访问specifie r和它可以在同一个包中可见。 受保护的访问说明符 受保护的 遗嘱在同一软件包中充当公共角色,而在软件包中充当私有角

  • 问题内容: JUnit框架包含2个类(显然是在不同的包中),每个类的方法似乎非常相似。有人可以解释为什么吗? 我要参考的类是:和。 问题答案: (JUnit 3的)旧方法是通过扩展标记测试类。那继承了它自己,并且您的测试类获得了以这种方式调用assert方法的能力。 从JUnit版本4开始,该框架用于标记测试。因此,您不再需要扩展。但这意味着,断言方法不可用。但是您可以静态导入新类。这就是为什么新

  • 功能区1:4大主菜单 Explore Search Git Debug 分别是文件夹,搜索,git和调试 功能区2:二级菜单 点击每个主菜单都会显示对应的二级菜单,比如Explore就是打开的目录,具体在后面讲解 功能区3:编辑区 我们最常用的编码区 功能区4:信息显示区 当前git信息,格式,字符编码等 master+ 0↓ 1↑ master代表当前git分支是master分支 0↓ 代表远端