编译器可以在C ++中重新排序变量设置和throw()
op吗?或者,标准C ++ 14882-1998是否允许或禁止编译此变换?
代码:
bool funct()
{
bool succeeded = false;
bool res_throw = false;
try {
throw("it");
succeeded = true;
}
catch(...) {
res_throw = true;
}
cout << "Result of throw: " << res_throw << endl;
cout << "succeeded: " << succeeded << endl;
return succeeded;
}
输出可以是
Result of throw: true
succeeded: true
标准说:“[intro.execution]#7”:
修改一个对象..都是一面 效果,这是变化的 执行环境的状态
在执行序列中称为序列点的某些特定点,先前评估的所有副作用应完整,并且不会产生后续评估的副作用
throw
语句是否为序列点?
答案 0 :(得分:4)
分号是序列点。抛出发生在succeeded
设置为true
编辑:澄清:succeeded
不会设置为true
答案 1 :(得分:4)
是的,有一个与throw
语句关联的序列点,因为每个语句的末尾都有一个序列点。
因此succeeded
必须在您的示例中保留false
。
我没有C ++ 98标准,但是在C ++ 03标准中:
1.9p16:每个完整表达式完成时有一个序列点。
语句是最简单的“完整表达式”,但标准的措辞是包含其他表达方式,这些表达式在技术上不属于任何语句。