【发布时间】:2014-09-01 16:55:48
【问题描述】:
在 Abrahams 创建的异常安全中,我们具有三个保证:基本保证、强保证和不抛出保证。 我可以说,如果我有一个代码库使用 nothrow 表示“新”并且 noexcept 表示方法签名,那么我有 no-throw 保证吗?
谢谢。
【问题讨论】:
标签: c++ exception-handling exception-safety
在 Abrahams 创建的异常安全中,我们具有三个保证:基本保证、强保证和不抛出保证。 我可以说,如果我有一个代码库使用 nothrow 表示“新”并且 noexcept 表示方法签名,那么我有 no-throw 保证吗?
谢谢。
【问题讨论】:
标签: c++ exception-handling exception-safety
不,这不是一个正确的结论。 no-throw 保证并不仅仅意味着你不抛出异常,它意味着操作总是成功完成。使用分配器的代码库在失败时返回nullptr,并通过返回状态代码来指示函数失败,很明显不匹配。也没有在检测到任何错误时调用abort() 的代码库。然而,使用new(nothrow) 和noexcept 函数,这两者都是完全可能的。
【讨论】:
您必须避免(或处理并从潜在故障中恢复)以下语言结构:
dynamic_cast 为引用类型,如果转换失败会抛出std::bad_cast;typeid 应用于取消引用潜在空指针的结果,这将抛出 std::bad_typeid
当然,您必须避免使用大部分标准库。特别是,容器之类的东西使用的分配器只能通过抛出来表示失败。
您将很难在“代码库”(如果您指的是整个程序或库的代码)中提供不抛出保证,因为通常会出现预期会失败的操作;这些最多可以有一个强有力的保证。
【讨论】: