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

はい、すべてthrowのステートメントの最後にシーケンスポイントがあるため、ステートメントに関連付けられたシーケンスポイントがあります。

だからあなたの例にsucceededとどまらなければならない。false

私はC++98標準を持っていませんが、C ++ 03標準では:

1.9p16:各完全式の完了時にシーケンスポイントがあります。

ステートメントは最も単純な種類の「完全な表現」ですが、標準は、技術的にはステートメントの一部ではない他の表現を含むように表現されています。

于 2010-12-06T17:44:15.987 に答える
4

セミコロンはシーケンスポイントです。スローsucceededはに設定される前に発生しますtrue

編集:明確にするために: succeededに設定されませんtrue

于 2010-12-06T17:41:15.507 に答える