围绕 noexcept 的困惑

Confusion around noexcept

看了很多视频,看了一本书,搞不清楚什么时候用,什么时候不用noexcept。

所有的书都说你应该只在函数永远不会抛出异常时才使用 noexcept 。

我觉得应该换个方式使用。许多人说分配的函数不应该是 noexcept,但是如果我不想捕获这些错误并且可以接受对 std::terminate 的调用怎么办?

简而言之,noexcept 应该用在永远不会抛出的函数上,或者用在除您想从中捕获异常的函数之外的所有函数上。

恕我直言,有些异常不需要捕获(即内存不足等)

标记 noexcept 是开发人员向编译器保证该函数永远不会抛出异常。

所以你应该把它添加到你知道应该永远不会抛出的函数中。如果这些函数由于某些模糊和不可知的原因抛出,编译器唯一能做的就是终止应用程序(因为您保证不应该发生的事情)。注意:从标记为 noexcept 的函数中,您可能不应该调用另一个函数,除非它也标记为 noexcept (就像 const 正确性一样,您需要具有 noexcept 正确性)

你应该在哪里使用它:

  swap()   methods/functions. 
           Swap is supposed to be exception safe.
           Lots of code works on this assumption.

  Move Constructor
  Move Assignment.
           The object you are moving from should already be
           fully formed so moving it is usually a processes of
           swapping things around.

           Also be marking them noexcept there are certain 
           optimizations in the standard library that can be used.

     Note: This is usually the case.
           If you can not guarantee that move/swap semantics are 
           exception safe then do not mark the functions as noexcept.

您不想对所有异常调用终止。大多数时候我会允许异常展开堆栈调用析构函数并正确释放资源。

如果没有被捕获则应用程序将终止。

但是大多数复杂的应用程序都应该对异常有弹性。捕获丢弃启动的任务记录异常并等待下一个命令。有时你仍然想退出,但仅仅因为我在图形应用程序中的涂抹操作失败并不意味着我希望应用程序不优雅地退出。我宁愿 smudge 操作被放弃,资源被重新声明,应用程序恢复正常操作(这样我就可以保存退出并重新启动)。