C ++中的序列点和异常

时间:2010-12-06 17:36:43

标签: c++ standards-compliance sequence-points

编译器可以在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语句是否为序列点?

2 个答案:

答案 0 :(得分:4)

分号是序列点。抛出发生在succeeded设置为true

之前

编辑:澄清:succeeded不会设置为true

答案 1 :(得分:4)

是的,有一个与throw语句关联的序列点,因为每个语句的末尾都有一个序列点。

因此succeeded必须在您的示例中保留false

我没有C ++ 98标准,但是在C ++ 03标准中:

  

1.9p16:每个完整表达式完成时有一个序列点。

语句是最简单的“完整表达式”,但标准的措辞是包含其他表达方式,这些表达式在技术上不属于任何语句。