【问题标题】:C++ omitting `noexcept` specifier versus `noexcept(false)`, what is their precise meaning?C++省略`noexcept`说明符与`noexcept(false)`,它们的确切含义是什么?
【发布时间】:2015-06-28 20:37:44
【问题描述】:

如果我将函数标记为noexcept(false),或任何其他计算结果为假的表达式,这意味着什么? (1) 我是否向编译器保证该函数可以抛出异常?,(2) 还是我不保证它是否可以抛出异常?

最后,如果我省略了noexcept 说明符,它就等价于noexcept(false),还是只等价于上述第(2)种含义?

【问题讨论】:

  • 如果你认为noexcept(false)noexcept(true) 的反面,a reference 可以回答所有问题。

标签: c++ c++11 noexcept


【解决方案1】:

通过指定noexcept(true),您声明该函数从不抛出异常。通过指定noexcept(false) 或不指定任何内容,您并不声称该函数从不抛出异常。

所以它基本上是你的语句 (2),但请注意,对于编译器来说,这相当于你的语句 (1)。如果编译器不能保证函数不会抛出,它必须假设它可以。

标准的相关位是C++11 15.4/12:

没有异常规范或具有noexcept(<i>constant-expression</i>)形式的异常规范的函数,其中常量表达式产生@ 987654324@ 允许所有例外。 异常规范非抛出如果它是throw()noexceptnoexcept(<i>constant-expression</i>)的形式,其中常量表达式 产生true。具有不抛出异常规范的函数不允许任何异常。

与该规则只有两个偏差。一种是析构函数——在析构函数上不放置异常规范会为析构函数提供与默认生成的异常规范相同的异常规范。也就是说,noexcept(true) 当且仅当从默认生成的析构函数中直接调用的所有函数都是noexcept(true)

另一个是释放函数 (operator delete)——没有明确异常规范的释放函数被视为 noexcept(true)

【讨论】:

  • @Deduplicator 更改了有关函数的措辞,但我似乎找不到对具有相同行为的构造函数的引用。你能提供一个段落编号吗?
  • @Deduplicator 仅当它不是用户提供的(即,在第一次声明时隐式声明或显式默认)。参见 [dcl.fct.def.default]/p2, [except.spec]/14。
  • 您还错过了释放函数,默认为noexcept(true)
【解决方案2】:

省略noexcept 说明符等同于noexcept(false)析构函数除外,其中省略说明符意味着让编译器从成员和基类中推断。

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2020-09-10
    • 2016-02-13
    • 2016-05-28
    • 2023-03-20
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多