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