2013-08-20 2 views
0

Глядя на раздел 5.3.7 C++ 11 Spec (n3485), примечание 3 говорит, что результат noexcept (expr) неверен, если:noexcept (выражение) - где выражение - это функция noexcept, которая на самом деле генерирует

... потенциально оцениваемый вызов функции ..., у которой нет спецификаций исключения исключающих исключений ... потенциально-оцененное выражение-броузер ... потенциально оцениваемый dynamic_cast. .. a потенциально оцененное выражение типа ...

Имеет ли «потенциальная оценка» ted "означает, что он сверлит вниз (совсем нет? немного?), чтобы определить, может ли одно из условий привести к ложному?

Я нахожу, что (в тестовом коде, а не в приложении) функция, которая утверждает, что она не существует, но делает, по сути, бросок (даже если во всех случаях) все равно будет считаться неэксклюзивным. Непонимание спецификации или код в следующем примере не так?

double calculate(....) noexcept { throw "haha"; } // using simpsons::nelson 

bool does_not_throw = noexcept(calculate()); 

Согласно Clang 3.3, этот тест говорит, что вычисление() не выбрасывает.

+1

«noexcept' не означает« ничего в этой функции или вещи, которые она вызывает, может означать, что это означает, что язык гарантирует вам, что исключение никогда не покинет эту функцию ». Если это необходимо, среда выполнения обеспечит эту гарантию, убив программу с помощью 'std :: terminate', вместо того чтобы исключить исключение из функции' noexcept'. (C++ 11 15.4/9) – Casey

+0

@Casey: +1, спасибо. – Arbalest

ответ

0

Все, что он делает, это проверка того, что выражение делает, чтобы определить, будут ли выражения выражения вызывать исключение. Он не проверяет фактический код, который потенциально может быть вызван. Если одним из выражений является вызов функции, который явно не указан noexcept, то предполагается, что он может генерировать исключения.

Или, по-другому, он проверяет, все ли функции, вызываемые в выражении, - noexcept. Это все.

Согласно Clang 3.3, этот тест говорит, что вычисление() не выбрасывает.

И это правда. Поскольку calculate определяется как noexcept, если он пытается испустить исключение, будет называться std::terminate. Поэтому никакие исключения не будут испускаться функцией.

Смежные вопросы