最近在我的代码中,我已经明确地在函数上编写noexcept(false)
,我知道这些函数会抛出异常,主要是为了阅读代码的人。但是,我想知道这是否会影响我的代码行为或编译器解释它的方式。这有什么不同吗?
注意:我知道析构函数是隐式noexcept,你必须指定noexcept(false)
来改变它,我想知道其他函数。
答案 0 :(得分:13)
没有异常说明符并明确说明noexcept(false)
是等效的,参见§15.4/ 12:
没有异常规范的函数或具有
noexcept(constant-expression)
形式的异常规范的函数,其中常量表达式产生false
允许所有异常。
因此编译器在考虑异常时不应区分它们。
更重要的是,你没有必要在noexcept(false)
处理你的职能。作为一名C ++开发人员,您应该假设默认情况下抛出每个函数(这就是标准采取此立场的原因),因此您不会通过写出来添加新信息;这对每个人来说都是浪费时间。
相反,请标记函数肯定不与noexcept
一起抛出的特殊情况,并标记函数可能投掷的情况,具体取决于某些条件noexcept(condition)
。
如果您的函数故意成为某个异常E
的来源,请在文档中写明。
答案 1 :(得分:-1)
在他的书More Exceptional C++中,Herb Sutter有以下片段(第130页):
示例19-1的正确答案要简单得多:
// Example 19-4: The right solution // T::~T() /* throw() */ { // ... code that won't throw ... }
示例19-4演示了如何做出设计决策而不是胡扯。
请注意
throw()
throws-nothing异常规范 只是一个评论。 这是我选择遵循的风格,部分原因 因为事实证明异常规范可以少得多 比他们的价值更有利。您是否决定实际编写规范是一个品味问题。
(强调我的)
所以,我觉得我必须指出,C ++异常安全代码中的一位主要专家似乎反对为编译器添加异常规范的整个概念(但仍然将其留在程序员的代码中)理解)。
只是觉得这可能是有趣的信息......