不是说/不可以说我们有无投保证吗?

时间:2014-09-01 16:55:48

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

在Abrahams创造的异常安全中,我们有三个保证:基本,强大和无投掷保证。 我可以说,如果我有一个代码库使用nothrow为“新”和noexcept方法签名,我有无投保证?

感谢。

2 个答案:

答案 0 :(得分:2)

您必须避免(或处理和恢复以下语言构造的潜在失败):

  • dynamic_cast到引用类型,如果转换失败则会引发std::bad_cast;
  • typeid应用于取消引用可能为空的指针的结果,该指针将抛出std::bad_typeid

当然,你必须避免使用标准库。特别是像容器这样的东西使用的分配器只能通过抛出来发出失败信号。

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

答案 1 :(得分:2)

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