让我们考虑,我有以下功能:和造作例外
SomeType createSomeType();
从而可以throw
因某些原因。
然后:
SomeType val = SomeType(); // initial value
try
{
val = createSomeType(); // here
}
catch (std::exception&)
{
}
如果createSomeType()
抛出,可我总是假设val
值不变?
让我们考虑,我有以下功能:和造作例外
SomeType createSomeType();
从而可以throw
因某些原因。
然后:
SomeType val = SomeType(); // initial value
try
{
val = createSomeType(); // here
}
catch (std::exception&)
{
}
如果createSomeType()
抛出,可我总是假设val
值不变?
是的,如果createSomeType()抛出一个异常,分配不会发生。控制流将从throw语句开始,通过createSomeType()在堆栈中的任何对象的析构函数,并最终传递到catch语句。
如果SomeType
的赋值运算符是异常安全的,那么您可以确定val
将被赋予一致的新值或其初始值保持不变。
但是,异常可能由createSomeType()
或在createSomeType()
成功运行后由分配引发。如果SomeType
的赋值运算符被重载并且可能抛出异常,则可能发生val
以“半分配”的不一致状态结束。后者是由于在设计中不采用异常安全而导致的,但是仍然可以发生。
从标准文档15.2.1,
作为从throw-表达到处理程序的控制通过时,析构函数调用所有自动对象构造 自输入try块。自动对象按照完成 构造的相反顺序销毁。
因此,val
值,也不会改变......
如果'createSomeType'抛出,将赋值运算符的身体不断进入?在这种情况下,它如何改变价值? – 2010-10-28 12:04:28
@ Space_C0wb0y:可能发生的情况是主体不会抛出,但重载的分配会抛出。 – sharptooth 2010-10-28 12:05:49
当'createSomeType'抛出时,OP明确要求提供案例,因此赋值运算符不会扮演角色(在该特定情况下)。 – 2010-10-28 12:06:30