问题标签 [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.
c++ - boost::bind 在绑定抛出异常的函数时在 VC++ 2010 中不起作用
我有一些在 Linux 下编译良好的代码,但我正在尝试将其移植到 Windows。我使用了来自 Boost Pro 的 Boost 1.50 预编译二进制文件,但是当我编译我的代码时,我得到了这个神秘的错误:
该错误是最无用的,因为它显示在 Boost 头文件的深处,没有表明我的代码中的问题出在哪里。尽管如此,通过注释掉各种代码块,我已将其缩小为原因:
如果我删除throw
函数定义中的说明符,它会起作用。我扔什么都没关系,无论是一个类还是一个int
. 我做错了什么,还是不能绑定到在 Visual C++ 中引发异常的函数?Boost Bind 文档似乎没有提出任何问题,而且 GCC 也没有任何问题。
[旁注:上面的代码不是我的实际代码,但在编译时会出现同样的问题。请避免关于抛出整数不好之类的评论,因为这只是一个微不足道的例子,以防万一有人希望重现该问题。]
c++ - ocl::CRException 的类型信息
我尝试使用 g++ 运行我的 C++ 程序,但出现以下异常: “typeinfo for ocl::CRException”正在使用包含 CRException 类的 ocl 命名空间。请帮助我。
这是包含 OCL 类的代码:
c++ - 抛出异常类型没有限制
我了解到,当我指定函数可以抛出的异常类型时,不能抛出其他异常,但是当我测试这段代码时,它没有遵循这条规则。
我误解了什么吗?
c++ - 为什么在编译时不检查 C++ 异常规范?
我刚刚读到在 C++11 标准修订版中,不推荐使用异常规范。我以前认为指定你的函数可能会抛出什么是好的做法,但显然不是这样。
在阅读了 Herb Stutter 被广泛引用的文章之后,我不禁想知道:到底为什么异常规范是以它们的方式实现的,为什么委员会决定弃用它们而不是在编译时检查它们?为什么编译器甚至允许抛出未出现在函数定义中的异常?对我来说,这听起来像是在说“你可能不应该指定你的函数返回类型,因为当你指定int f()
,但return 3.5;
在它里面,你的程序可能会崩溃。” (即,与强类型的概念区别在哪里?)
(由于 s 中缺乏异常规范支持typedef
,鉴于模板语法可能是图灵完备的,实现这听起来很容易。)
c++ - 如何获得有关旧异常规范的警告
我知道除其他外(如 auto_ptr),异常规范在 C++11 中已被弃用。
有没有办法使用以下代码从 g++ 4.8 获得警告?
我已经尝试过-Wall -pedantic -Wextra -Wdeprecated-declarations,但没有任何成功。
c++11 - 类外定义的默认移动操作的异常规范是什么?
考虑这个类:
因为 C1 的 move ctor 在它的第一个声明中被显式默认,标准的 8.4.2 告诉我们它具有相同的异常规范 (ES),就好像函数被隐式声明一样。然后我们可以使用 15.4/14 和 12.8/15 得出其 ES 为 的结论noexcept(true)
。
现在考虑一个相同的类 C2,除了它的移动 ctor 在类定义之外是默认的:
C2 的 move ctor 的 ES 是什么?因为它在第一次声明时没有默认,所以 8.4.2/2 不适用。因为它没有明确的 ES,所以 8.4.2/3 不适用。因为它没有隐式声明,所以 15.4/14 不适用。据我所知,这意味着 15.4/12 适用,它表示默认函数 ES 是noexcept(false)
.
如果我是对的,那意味着 C1 中的移动 ctor 是noexcept(true)
,但 C2 中概念上相同的移动 ctor 是noexcept(false)
。
我对 C2 的推理是否正确?
c++ - 异常规范作为函数声明中的注释
我在代码中使用 C++ 异常而不是返回值来指示错误,因此我的代码必须是异常安全的。因此,我在函数声明中添加了一个异常规范作为注释。例如:
这是好习惯吗?
此外,如果我评估我的代码以制定这些规范,我是否必须只记住 C++ 异常或 SEH 异常,例如取消引用 nullptr、溢出或除以零异常?
假设我使用了一个 3rd-party 库,它永远不会抛出 C++ 异常,但可能会抛出 SEH 异常。我的函数,它依赖于那个库的函数,可以永远是 noexcept 吗?
c++ - 过渡到使用 noexcept 隐式声明析构函数的 C++11
在 C++11 中,没有任何异常规范的析构函数用 隐式声明noexcept
,这是对 C++03 的更改。因此,过去在 C++03 中从析构函数中抛出的代码在 C++11 中仍然可以正常编译,但一旦尝试从这样的析构函数中抛出,就会在运行时崩溃。
由于这样的代码没有编译时错误,它如何安全地转换到 C++11,没有将代码库中所有现有的析构函数声明为 is noexcept(false)
,这将是非常冗长和侵入性的,或者检查每个析构函数是否可能抛出,这将非常耗时且容易出错,或者在运行时捕获并修复所有崩溃,这永远不能保证找到所有此类情况?
c++ - 为什么 std::map find() 没有声明为 noexcept?
C++14 标准定义的 find() 成员函数std::map
如下:
为什么这些函数没有定义为noexcept
?内部可能出现什么问题,需要抛出异常或产生未定义的行为(除了找不到元素,在这种情况下函数返回end
迭代器并且无论如何都不需要抛出异常)?
c++ - 使用 sed 从 C++ 代码中删除异常规范
我想从我的 c++ 代码中自动删除不推荐使用的异常规范,并尝试使用 sed 来完成此任务。
异常规范格式throw
后面是括号之间的异常(单词)列表,所以我写了这个 sed:
它适用于单行规范,但不适用于多行规范。
根据文档,点似乎与换行符不匹配,它必须:https ://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
我尝试了这种解决方法,但它也不起作用(实际上它甚至不适用于单行规范):
如何让它正常工作?
编辑:
异常规范示例: