【发布时间】:2012-10-04 23:26:25
【问题描述】:
在 C++ 中,对于将要被抛出的对象的构造函数自己抛出异常是否有效?换句话说,当我们仍在构造要抛出的对象时,我们是否还在抛出中?
struct Error {
Error() {
if (someCondition()) {
throw anotherObject();
}
}
};
void test() {
throw Error();
}
【问题讨论】:
在 C++ 中,对于将要被抛出的对象的构造函数自己抛出异常是否有效?换句话说,当我们仍在构造要抛出的对象时,我们是否还在抛出中?
struct Error {
Error() {
if (someCondition()) {
throw anotherObject();
}
}
};
void test() {
throw Error();
}
【问题讨论】:
throw 表达式必须是 throw Error();,但是是的,这是有效的。
在Error 对象可以被抛出之前,它必须被构造。也就是说,必须先计算子表达式 Error(),然后才能在完整表达式中计算 throw 运算符。如果对子表达式 Error() 的求值本身引发异常,则不会求值整个表达式的其余部分(即 throw)。
【讨论】: