3

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

谢谢。

4

2 回答 2

2

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

  • dynamic_caststd::bad_cast到一个引用类型,如果转换失败,它将抛出;
  • typeid应用于取消引用潜在空指针的结果,这将抛出std::bad_typeid

当然,您必须避免使用许多标准库。特别是,像容器这样的东西使用只能通过抛出来表示失败的分配器。

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

于 2014-09-01T17:08:24.197 回答
2

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

于 2014-09-01T17:08:43.173 回答