问题标签 [exception-specification]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
699 浏览

c++ - 将已删除的函数声明为 noexcept 有什么意义吗?

考虑一个类的这两个可能的定义:

展品 A:

图表 A':

将已删除的函数声明为 有什么意义noexcept

0 投票
1 回答
545 浏览

c++ - 在 C++17 中变成 noexcept 的函数?

根据这个答案,异常规范将成为 C++17 中函数类型的一部分。这是否意味着许多函数的异常规范也会改变,例如 C 兼容性头文件中的函数获得noexcept规范?在 C++17 中,哪些标准函数的异常规范将更改为?noexcept

编辑:显然P0488R0是 2016 年 10 月 19 日国家机构对标准工作草案的评论,包括为标记几个 C 兼容性功能而提出的更改noexcept(参见 US 172-178)。我想我们将不得不等待 WG21 对此作出反应。

0 投票
1 回答
240 浏览

c++ - 继承类中没有构造函数时如何抛出异常?

我不确定这个问题是否合适,但我会尽力而为。

这是我的作业问题。如果两条线平行或相等,作业要求我抛出异常。

原始代码由我的教授提供,我的工作是对其进行修改以使其能够引发异常。

线.h

教授告诉我们不要修改头文件,只能修改.cpp文件。

线.cpp

因为这两个继承的类是空的,因此没有构造函数来初始化errorMsg,我也不能创建这些类的对象来抛出异常。任何替代解决方案来实现这一目标?

0 投票
1 回答
97 浏览

c++ - main() 可以有异常规范吗?

在标准 C++ 中,main函数可以有异常规范吗?

例如,以下是否合法?

0 投票
5 回答
15611 浏览

c++ - c++1z动态异常规范错误

我正在尝试使用新的 GCC 版本 7.2.1 编译我的项目,但动态异常规范存在问题:

问题是这些错误来自我无法控制的第三方库。

有什么办法可以解决吗?据我所知,我不能告诉编译器用警告替换错误。使用--std=c++14不是一个选项,因为我想使用 C++1z 的新功能。

0 投票
1 回答
272 浏览

c++ - ˋtypedefˋ 中的异常规范完全禁止还是仅在顶层?

在 C++14 Sec 15.4;2 中声明,...异常规范不应出现在 typedef 声明或别名声明中。

这意味着禁止以下行为:

但是不应该出现的措辞是否意味着令牌noexcept不能出现在 typedef 声明中的任何地方?

例如,这两者是否也被禁止?

它们都试图定义一个类型fn1,并fn2能够指向一个函数,该函数接受一个指向函数的指针,该函数接受一个int并且不返回任何内容,同时承诺永远不会抛出异常。

因此,在我的示例中,异常规范不适用于顶级类型fn1。由这些函数可能接收的参数fn2引入。typedef

那么我应该逐字逐句采用 15.4;2 吗,因此我的两个示例都无效?还是仅禁止应用于类型定义并且我的示例是正确的?

0 投票
1 回答
175 浏览

c++ - 为什么旧的空抛出规范被重写为新语法“noexcept”?

标题说明了一切:为什么 C++ 放弃了完全令人满意、有用的空抛出规范throw(),并用另一种语法替换它,并引入了 new 关键字noexcept

空抛出规范是“仅抛出这些枚举异常的保证”(书面),但枚举异常为零:您可以抛出空集,throw(X,Y,Z)而不是抛出X, Yor (和派生类型):这是对函数的保证从不向调用者扔任何东西,换句话说,从不扔,或“不扔”规范Z

那无偿使用基本相同的工具制作新代码,表达相同的承诺,与旧代码不兼容,旧代码被弃用然后被禁止,无缘无故地破坏向后兼容性?

是什么引起了这样的仇恨throw()

据我所知,只有旧的不安全gets和愚蠢无用的隐含int被严厉对待。

编辑:

所谓的“重复”是基于虚假陈述。

在所谓的“动态异常规范”中没有“动态”。这是我对新的 throw 规范最讨厌的地方:反对“动态”和“静态”的空洞术语的含义。

0 投票
2 回答
151 浏览

c++ - 是否有任何版本的 C++(甚至是预标准)是 `throw()` 并不意味着“永远不能抛出”?

问题是关于 C++ 的历史:ISO 标准、修订标准(带有 DR),甚至是标准草案;都算作“C++”。

是否有任何 C++ 不具备此属性

使用空抛出规范声明的函数throw()不能抛出异常。

如果该属性不成立,我想要一个反例。

注释:

不言而喻,在函数抛出异常,然后捕获(不重新抛出)异常,是否会将其转换为“抛出异常的函数”。根据其规范,抛出异常的函数会向其调用者抛出异常。(如果您在内部进行操作,则根据定义,它不是规范的一部分。)

[假设这longjmp是被禁止的,因为我们有可破坏的物体。]

该问题的其他等效表达是:

是否有任何情况下声明的无抛出函数的调用者不得不担心这种可能性(等效属性):

  • 该函数将控制权交还给其调用者,但不使用 return 语句
  • 查看(并能够捕获)该函数抛出的异常
  • 由于调用该函数而导致堆栈展开
  • 如果所有其他操作(调用该函数除外)都是非抛出的,则调用者不是非抛出的

换句话说,是否有任何 C++编译器无法根据看到被调用函数的无抛出声明来优化调用函数?

0 投票
4 回答
279 浏览

c++ - 为什么 c++ 使用 throw() 关键字来指示函数不会抛出任何异常

这个关键字是不是有点反直觉?

该函数不会抛出任何异常,因此我们向它添加了一个 throw() 标记。它应该是silent()还是类似的东西?

0 投票
1 回答
76 浏览

c++ - 如何使用抛出析构函数检测构造函数是否为 noexcept

以下代码将无法在大多数编译器上编译:

CppReference 还指出这在编译器实现中很常见,但没有提供替代方案。如何在没有析构函数影响结果的情况下测试构造函数是否为 noexcept?