2010-10-28 38 views
5

让我们考虑,我有以下功能:和造作例外

SomeType createSomeType(); 

从而可以throw因某些原因。

然后:

SomeType val = SomeType(); // initial value 

try 
{ 
    val = createSomeType(); // here 
} 
catch (std::exception&) 
{ 
} 

如果createSomeType()抛出,可我总是假设val不变

回答

7

是的,如果createSomeType()抛出一个异常,分配不会发生。控制流将从throw语句开始,通过createSomeType()在堆栈中的任何对象的析构函数,并最终传递到catch语句。

1

如果SomeType的赋值运算符是异常安全的,那么您可以确定val将被赋予一致的新值或其初始值保持不变。

但是,异常可能由createSomeType()或在createSomeType()成功运行后由分配引发。如果SomeType的赋值运算符被重载并且可能抛出异常,则可能发生val以“半分配”的不一致状态结束。后者是由于在设计中不采用异常安全而导致的,但是仍然可以发生。

+4

如果'createSomeType'抛出,将赋值运算符的身体不断进入?在这种情况下,它如何改变价值? – 2010-10-28 12:04:28

+0

@ Space_C0wb0y:可能发生的情况是主体不会抛出,但重载的分配会抛出。 – sharptooth 2010-10-28 12:05:49

+1

当'createSomeType'抛出时,OP明确要求提供案例,因此赋值运算符不会扮演角色(在该特定情况下)。 – 2010-10-28 12:06:30

0

从标准文档15.2.1,

作为从throw-表达到处理程序的控制通过时,析构函数调用所有自动对象构造 自输入try块。自动对象按照完成 构造的相反顺序销毁。

因此,val值,也不会改变......