添加`noexcept(false)`会以任何方式使代码受益吗?

LB-*_*B-- 14 c++ noexcept c++11

最近在我的代码中,我已经明确地编写noexcept(false)了我知道会抛出异常的函数,主要是为了阅读代码的人.但是,我想知道这是否会影响我的代码行为或编译器解释它的方式.它有什么不同吗?

注意:我知道析构函数是隐式noexcept,你必须指定noexcept(false)更改它,我想知道其他函数.

GMa*_*ckG 15

没有异常说明符和明确说明noexcept(false)是等效的,参见§15.4/ 12:

没有异常规范的函数或具有异常noexcept(constant-expression)表达式的异常规范的函数false允许所有异常.

因此编译器在考虑异常时不应区分它们.


更重要的是,您无需专注于noexcept(false)自己的职能.作为一名C++开发人员,您应该假设默认情况下抛出每个函数(这就是标准采取此立场的原因),因此您不会通过写出来添加新信息; 这对每个人来说都是浪费时间.

相反,请标记一个函数绝对不会抛出的特殊情况noexcept,并标记函数可能根据某些条件抛出的情况noexcept(condition).

如果您的函数故意是某些异常的来源E,请在您的文档中写下.

  • 请注意,在C++ 11中,析构函数默认为"noexcept(true)".如果要覆盖它,则必须添加`noexcept(false)`.然而,这几乎总是一个坏主意.(我冒昧地说这总是一个坏主意;我只是用"差不多"来对冲,以防万一我没有足够的想象力.)大量的代码,包括标准库,假设析构函数总是成功,而且非常如果清理失败,很难以故障可恢复的方式编写代码.在许多情况下,这是不可能的(例如静态初始化或多个类成员). (4认同)