Как сейчас правильно указывать, что функция выбрасывает исключения? Писать throw(...)
или перечислять возможные исключения или вообще ничего не писать?
И еще вопрос: что указывается в скобках после noexcept
?
Если функция выбрасывает исключения - то ничего не писать. (Или можно эквивалентно написать noexcept(false)
).
Что указывается в скобках noexcept
зависит от того, о каком noexcept
вы говорите. Есть оператор noexcept
, а есть спецификатор noexcept
.
Оператор noexcept
проверяет noexcept-статус выражения. Это оператор времени компиляции. В качестве операнда указывается выражение, чей noexcept-статус вы хотите узнать. Оператор на стадии компиляции вернет true
или false
.
Спецификатор noexcept
наоборот назначает noexcept-статус функции. Он декларирует, является ли данная функция noexcept
или не является. Просто noexcept
говорит, что функция является noexcept
. А в варианте с булевским операндом noexcept-статус определяется значением булевского выражения.
Например, в следующем примере используется как оператор noexcept
, так и спецификатор noexcept
void bar() noexcept(noexcept(foo()));
^ ^
| |
| оператор
спецификатор
Функция bar()
в результате получит тот же noexcept-статус, что и функция foo()
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты