Указав noexcept(true)
, вы утверждаете, что функция никогда не выдает исключений. Указав noexcept(false)
или ничего не указав, вы не утверждаете, что функция никогда не генерирует исключений.
Так что это в основном ваше утверждение (2), но обратите внимание, что для компилятора это эквивалентно вашему утверждению (1). Если компилятор не уверен, что функция не вызовет исключение, он должен предположить, что может.
Соответствующий бит стандарта — С++ 11 15.4/12:
Функция без спецификации-исключения или с спецификацией-исключения вида noexcept(constant-expression)
, где константное-выражение возвращает false
, разрешает все исключения. Спецификация-исключения является негенерирующей, если она имеет форму throw()
, noexcept
или noexcept(constant-expression)
, где константное-выражение возвращает true
. Функция с негенерирующей спецификацией-исключения не допускает никаких исключений.
Есть только два отклонения от этого правила. Один из них заключается в том, что деструкторы, не вводящие спецификацию исключения в деструктор, дают деструктору ту же спецификацию исключения, что и деструктор, сгенерированный по умолчанию. То есть noexcept(true)
тогда и только тогда, когда все функции, которые будут напрямую вызываться из сгенерированного по умолчанию деструктора, равны noexcept(true)
.
Другая — это функции освобождения памяти (operator delete
). Функция освобождения памяти без явного определения исключения рассматривается как noexcept(true)
.
person
Angew is no longer proud of SO
schedule
21.04.2015
noexcept(false)
за противоположностьnoexcept(true)
, ссылка отвечает на все вопросы. - person chris   schedule 21.04.2015