我知道,标记一个函数noexcept可能有助于[在某些情况下]获得许多很棒的优化,例如移动语义。但是假设,我的代码中有一个函数执行非常关键的操作,如果该函数失败,则意味着发生了非常糟糕的事情以至于无法恢复,并且该程序应该立即终止。如果我故意标记这样一个函数,noexcept即使我承认有异常的可能性,只是为了在发生异常时杀死程序怎么办?
有些东西告诉我这不是它应该使用的用途,但它是 的有效用途吗noexcept?
use*_*522 11
例如移动语义
noexcept在移动语义中不起任何作用,除了一些容器尝试避免调用非noexcept移动构造函数来提供异常安全保证,否则这是不可能的。
发生了非常糟糕的事情,无法恢复,应该立即终止该程序。
如果堆栈上的任何位置都没有捕获异常,那么即使该函数没有被标记,这也已经是将会发生的情况noexcept(除了堆栈展开可能会发生也可能不会发生)。如果异常在堆栈的某个位置被捕获,那么大概可以正确处理它,并且不需要立即终止。
如果异常本身的原因非常严重,以至于程序在任何情况下都无法继续,那么一开始就不应该抛出异常。std::abort该程序应该在导致问题的站点上调用或类似的东西。
但当然,如果您认为有必要立即终止,请标记它noexcept。然而,我仍然会使用catch(...)函数中的处理程序并调用std::terminate或std::abort手动显式捕获所有异常,因此读者和工具很清楚这是预期的行为。(在这种情况下,堆栈将展开到处理程序。)
如果我故意标记一个函数[我知道可能会抛出] noexcept 以在发生异常时立即终止,我的代码是否格式不正确?
不,让异常逃逸函数noexcept是完全可以的。它具有定义的行为:std::terminate将被调用以通过当前设置的终止处理程序终止程序(并且也可能或可能不预先展开堆栈,可能只是部分地,包括函数noexcept)。