C++ 矫揉造作与例外 让我考虑一下以下功能: SomeType createSomeType();

C++ 矫揉造作与例外 让我考虑一下以下功能: SomeType createSomeType();,c++,exception,C++,Exception,根据某些原因,它可以抛出 然后: 如果createSomeType()抛出,我是否可以始终假定val值未更改?是,如果createSomeType()抛出异常,则不会发生赋值。控制流将从throw语句开始,经过任何对象createSomeType()的析构函数如果SomeType的赋值运算符是异常安全的,则可以确保val将被分配一个一致的新值,或者其初始值将保持不变 但是,异常可能由createSomeType()引发,也可能由createSomeType()成功运行后的赋值引发。如果SomeT

根据某些原因,它可以抛出

然后:


如果
createSomeType()
抛出,我是否可以始终假定
val
未更改?

是,如果createSomeType()抛出异常,则不会发生赋值。控制流将从throw语句开始,经过任何对象createSomeType()的析构函数如果
SomeType
的赋值运算符是异常安全的,则可以确保
val
将被分配一个一致的新值,或者其初始值将保持不变


但是,异常可能由
createSomeType()
引发,也可能由
createSomeType()
成功运行后的赋值引发。如果
SomeType
的赋值运算符重载,并且可能引发异常,
val
可能最终处于“半赋值”不一致状态。后者是由于在
SomeType
设计中没有采用异常安全,这是很糟糕的,但仍然可能发生。

来自标准文档15.2.1

当控件从抛出表达式传递到处理程序时,将为所有构造的自动对象调用析构函数 自输入try块后。自动对象将按与其完成任务相反的顺序销毁 建筑


因此,
val
值不会改变…

如果
createSomeType
抛出,是否会输入赋值运算符的主体?在这种情况下,它如何改变值?@Space_C0wb0y:可能发生的情况是,主体没有抛出,但重载的赋值抛出。OP在
createSomeType
抛出时显式请求该case,因此赋值操作符不起作用(在特定场景中)。@sharptooth OP说“createSomeType()抛出”@皮本:好吧,我编辑了答案,把重点放对了。
SomeType val = SomeType(); // initial value

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