今天了解到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/