3

throw()编译器可以在 C++ 中重新排序变量设置和操作吗?或者,标准 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语句是序列点吗?

4

2 回答 2

4

分号是一个序列点。抛出发生之前succeeded设置为true

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

于 2010-12-06T17:41:15.507 回答
4

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

所以succeeded必须留false在你的榜样。

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

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

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

于 2010-12-06T17:44:15.987 回答