【问题标题】:Does nothrow/noexcept are sufficient to say we have no-throw guarantee?nothrow/noexcept 是否足以说明我们有不抛出保证?
【发布时间】:2014-09-01 16:55:48
【问题描述】:

在 Abrahams 创建的异常安全中,我们具有三个保证:基本保证、强保证和不抛出保证。 我可以说,如果我有一个代码库使用 nothrow 表示“新”并且 noexcept 表示方法签名,那么我有 no-throw 保证吗?

谢谢。

【问题讨论】:

    标签: c++ exception-handling exception-safety


    【解决方案1】:

    不,这不是一个正确的结论。 no-throw 保证并不仅仅意味着你不抛出异常,它意味着操作总是成功完成。使用分配器的代码库在失败时返回nullptr,并通过返回状态代码来指示函数失败,很明显不匹配。也没有在检测到任何错误时调用abort() 的代码库。然而,使用new(nothrow)noexcept 函数,这两者都是完全可能的。

    【讨论】:

      【解决方案2】:

      您必须避免(或处理并从潜在故障中恢复)以下语言结构:

      • dynamic_cast 为引用类型,如果转换失败会抛出std::bad_cast
      • typeid 应用于取消引用潜在空指针的结果,这将抛出 std::bad_typeid

      当然,您必须避免使用大部分标准库。特别是,容器之类的东西使用的分配器只能通过抛出来表示失败。

      您将很难在“代码库”(如果您指的是整个程序或库的代码)中提供不抛出保证,因为通常会出现预期会失败的操作;这些最多可以有一个强有力的保证。

      【讨论】:

      • 您没有来避免任何这些构造,只要您在声明不抛出保证的 API 函数边界之前处理异常.
      • @CharlesBailey:确实,“避免”相当强烈。如果故障是可恢复的,那么您可以处理它并且仍然给予保证。
      • 但是 Sutter 说:“Nothrow 保证:该函数在任何情况下都不会发出异常。” gotw.ca/gotw/059.htm
      • @FaustoCarvalhoMarquesSilva:确实。如果您想提供该保证,那么您需要处理函数中的任何潜在异常并从中恢复。如果你不能做到这一点,那么你就不能提供保证。
      • -fno-rtti 是一个选项吗?
      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2020-10-24
      • 2015-06-28
      • 2017-06-30
      • 2016-02-13
      • 1970-01-01
      • 2020-03-18
      • 2013-08-14
      相关资源
      最近更新 更多