Точки последовательности в C++ и исключения

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


person osgx    schedule 06.12.2010    source источник


Ответы (2)


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

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

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

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

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

person aschepler    schedule 06.12.2010
comment
Таким образом, каждый ; после оператора является последовательностью. точка? Даже Jump statements ? - person osgx; 06.12.2010
comment
Хороший улов. Технически не каждое выражение является полным выражением. break;, continue;, return;, goto label; и некоторые объявления, такие как int x;, не содержат или неявно используют какие-либо синтаксические выражения. - person aschepler; 06.12.2010
comment
В моем случае Throw определяется как выражение в 5.17 [expr.ass] выражение-присваивания: выражение-выброса и 15 [кроме] выражение-выброса: throw выражение-присваивания_opt - person osgx; 06.12.2010
comment
программное обеспечение .intel.com/en-us/blogs/2007/11/30/ скомпилируйте это с помощью gcc -O2 -S с использованием gcc 4.0 или icc. Оба сначала сделают сохранение в Ready, поэтому его можно перекрыть вычислением i/10. Изменение порядка не является ошибкой компилятора. Это агрессивный оптимизатор, выполняющий свою работу. - person osgx; 13.12.2010
comment
@osgx: Эта цитируемая статья отличается. В этом случае оптимизатору разрешается переупорядочивать операторы из-за правила «как если бы», Стандартный раздел 1.9. В вашем примере программа проверяет, изменилось ли значение, поэтому оно должно быть правильным. В приведенном примере сама программа не может действовать иначе, когда операторы переупорядочиваются, поэтому оптимизатор может делать то, что хочет. (Многопоточные программы выходят за рамки C++98 и C++03, но проект стандарта C++0x разрешает многопоточные программы, и любые результаты, зависящие от другого потока, обычно не указываются.) - person aschepler; 13.12.2010

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

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

person John Dibling    schedule 06.12.2010
comment
точка с запятой - это точка последовательности. Пожалуйста, помогите мне найти это в стандарте 14882 (номер страницы или раздела или название раздела) - person osgx; 06.12.2010
comment
@osgx: в конце оценки полного выражения (§1.9/16) (полное выражение — это выражение, которое не является подвыражением другого выражения.) - person John Dibling; 06.12.2010
comment
точная фраза — 16. При завершении оценки каждого полного выражения есть точка следования 10). - person osgx; 06.12.2010
comment
@osgx: Да. В чем вопрос? - person John Dibling; 06.12.2010