4

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

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

我认为应该以其他方式使用它。许多人说分配的函数不应该是 noexcept,但是如果我不想捕获这些错误怎么办,并且调用 tostd::terminate是可以接受的?

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

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

4

1 回答 1

3

标记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.

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

如果没有被捕获,那么应用程序将终止。

但大多数复杂的应用程序应该能够适应异常。捕获丢弃已启动的任务日志异常并等待下一个命令。有时您仍然想退出,但仅仅因为我在图形应用程序中的涂抹操作失败并不意味着我希望应用程序不正常地退出。我宁愿涂抹操作被放弃资源回收并且应用程序恢复正常操作(这样我可以保存退出并重新启动)。

于 2015-07-15T06:46:17.600 回答