有没有可能导致C++异常的“代码语句”的完整列表(可能是递归定义的)?事情是这样的:什么(和什么不能)在C++中抛出异常?
1)throw
声明(自然)
2)调用new
3)调用从标准库被记录在案,以便能够抛出任何功能。
4)调用任何包含1-3操作的用户定义函数(包括构造函数)。
5)别的吗?在堆栈上分配本地对象,对内置类型进行操作,取消引用指针,类型转换 - 是否可以抛出?
6)其他一切都是免费的。
通过免例外我并不是指总是成功的操作。解引用指针肯定不是。但是,将它包装在try-catch
块中仍然没有意义,请考虑函数解引用指针的异常安全性等。因此,成功或导致未定义行为的代码可以被视为无异常。
Upd。尽管我最后一段我仍然有一个评论,未定义的行为也可以抛出,所以让我解释我的意思。请考虑下面的代码:
void bar();
Class C{
...
public:
foo() {
something_that_breaks_class_invariants;
bar();
something_that_restores_class_invariants;
}
}
如果我正确理解什么异常安全之约,然后如果bar()
可以抛出异常,该代码是坏的。我应该改变语句的顺序,否则我应该把bar()
换成try-catch
块,恢复类不变量并进一步传播异常。如果bar()成功返回或导致未定义的行为(因为我不知道,其他东西已损坏),那么foo()
就可以。 foo()
不能做任何事情,不应该关心bar()
的未定义行为。在这个意义上bar()
是免费的,可以标记为noexcept
等
所以我的问题是:什么样的语句可以在bar()
认为它是免费的这种感觉?
先假设一切都可以抛出。那么如果你需要证明它没有。这是一个XY问题的味道。 –
任何未定义的行为都可能导致抛出异常...... –
将'std :: vector :: at'包装在try-catch中并没有什么意义。 – chris