26

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

注意:我知道析构函数是隐含的 noexcept 并且您必须指定noexcept(false)更改它,我想知道其他函数。

4

2 回答 2

23

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

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

所以编译器在考虑异常时不应该区分它们。


更重要的是,您无需执行noexcept(false)您的功能。作为 C++ 开发人员,您应该假设每个函数都默认抛出(这就是标准采取这种立场的原因),因此您不会通过写出来添加新信息;这对每个人来说都是浪费时间。

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

如果您的函数故意成为某些异常的来源,请将其E写在您的文档中。

于 2013-04-26T20:07:16.547 回答
-1

Herb Sutter在他的《More Exceptional C++》一书中有以下片段(第 130 页):

示例 19-1 的正确答案要简单得多:

// Example 19-4: The right solution
//
T::~T() /* throw() */
{
 // ... code that won't throw ...
}

示例 19-4 演示了如何做出设计决策而不是胡扯。

请注意,throw()throws-nothing 异常规范只是一个注释。这就是我选择遵循的风格,部分原因是事实证明异常规范所带来的好处远低于它们的价值。您是否决定实际编写规范是一个品味问题。

(强调我的)

所以,我觉得我必须指出,C++ 异常安全代码方面的领先专家之一似乎反对添加异常规范供编译器使用的整个概念(但仍将其留在代码中以供程序员理解) .

只是觉得这可能是有趣的信息...

于 2013-04-26T21:03:49.417 回答