关于noexcept

时间:2015-07-15 03:59:11

标签: c++ c++11 noexcept

看完很多视频,看书后,我不清楚何时何时不使用noexcept。

所有的书都说你应该只使用noexcept,当一个函数永远不会抛出。

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

简而言之,不应该在永不抛出的函数上使用,或者除了你想要捕获异常的函数之外的所有函数都使用。

恕我直言,不需要捕捉一些例外情况(即内存不足等)

1 个答案:

答案 0 :(得分: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.

您不想在所有例外情况下致电终止。大多数情况下,我会允许异常解除调用析构函数的堆栈并正确释放资源。

它没有被捕获然后应用程序将终止。

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