c++ - 在 C++ 中哪些操作不能抛出异常?

标签 c++ exception

今天了解到swap在C++中是不允许抛出异常的。

我也知道下面的也不能抛出异常:

  • 析构函数
  • 读/写原始类型

还有其他的吗?
或者,是否有某种列表提到了所有可能不会抛出的东西?
(显然比标准本身更简洁。)

最佳答案

不能不应该之间有很大的区别。基本类型的操作不能抛出,因为函数和成员函数一样多,包括标准库和/或许多其他库中的许多操作。

现在不应该,你可以包含析构函数和交换。根据您实现它们的方式,它们实际上可以抛出,但您应该避免使用抛出的析构函数,并且在 swap 的情况下,提供具有不抛出保证的交换操作是最简单的方法在你的类中实现强异常保证,因为你可以copy放在一边,对拷贝执行操作,然后与原始swap

但请注意,语言允许析构函数和swap都抛出。 swap can throw,在最简单的情况下,如果你不重载它,那么 std::swap 会执行复制构造、赋值和销毁,三个操作,每个都可以抛出异常(取决于您的类型)。

析构函数的规则在 C++11 中发生了变化,这意味着没有异常规范的析构函数具有隐式 noexcept 规范,这反过来意味着如果它抛出异常,运行时将调用 terminate,但是你可以将异常规范改为noexcept(false),然后析构函数也可以抛出。

归根结底,如果不了解代码库,就无法提供异常保证,因为几乎 C++ 中的每个函数都允许抛出异常。

关于c++ - 在 C++ 中哪些操作不能抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11606106/

相关文章:

java - 如果更高级别处理异常,是否应该在较低级别检查异常

java - Java编程时如何处理异常?

c++ - 静态函数作为类模板参数 - 导致可维护性问题

c++ - 当树莓派终端上的更新时间时,QT 上的 exe 文件挂起

jquery - 如何在 ASP.NET 4 母版页中使用 jQuery

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

c++ - 是否可以避免在实现文件中重复类名?

c# - 将非托管 C++ 项目移植到 C#

C++ Base 转换在递归函数期间意外输出到屏幕

java - 如何运行循环直到不生成异常