Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Спецификация исключений C++

Как сейчас правильно указывать, что функция выбрасывает исключения? Писать 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()

Комментариев нет:

Отправить комментарий