Очки последовательности в C ++ и исключения - PullRequest
3 голосов
/ 06 декабря 2010

Может ли компилятор изменить порядок переменных и throw() op в 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 точкой последовательности?

Ответы [ 2 ]

4 голосов
/ 06 декабря 2010

Да, есть точка последовательности, связанная с оператором throw, потому что есть точка последовательности в конце каждого оператора .

Так что succeeded должно остаться false в вашем примере.

У меня нет стандарта C ++ 98, но в стандарте C ++ 03:

1.9p16: есть точка последовательностипо завершении каждого полного выражения.

Оператор - это самый простой вид «полного выражения», но в стандарте сформулированы другие выражения, которые технически не являются частью какого-либо оператора.

4 голосов
/ 06 декабря 2010

Точка с запятой является точкой последовательности. Бросок происходит до того, как succeeded установлен на true

РЕДАКТИРОВАТЬ: Чтобы уточнить: succeeded не будет установлен в true

...