2012-10-04 85 views
2

在C++中,对于将要抛出的对象的构造函数是否有效会引发异常?换句话说,当我们还在构建要抛出的对象时,我们还处于投掷状态吗?可以抛出一个对象的构造函数抛出异常吗?

struct Error { 
    Error() { 
    if (someCondition()) { 
     throw anotherObject(); 
    } 
    } 
}; 

void test() { 
    throw Error(); 
} 

回答

9

投掷表达式需要是throw Error();,但是,这是有效的。

Error对象可以被抛出之前,它必须被构造。也就是说,必须评估子表达式Error(),才能在完整表达式中评估throw运算符。如果对子表达式Error()的评估本身引发异常,则将不评估完整表达式的其余部分(即,throw)。