Недавно в моем коде я явно писал noexcept(false)
в функциях, которые я знаю, генерируются исключения, в основном для людей, читающих код. Однако мне интересно, влияет ли это на поведение моего кода или то, как компилятор его интерпретирует. Есть ли какая-то разница?
Примечание: я знаю, что деструкторы неявно отсутствуют, и что вы должны указать noexcept(false)
чтобы изменить это, я задаюсь вопросом о других функциях.
Не имеет спецификатора исключения и явно указывает noexcept(false)
эквивалентны, см. §15.4 / 12:
Функция без спецификации исключений или со спецификацией исключений в форме
noexcept(constant-expression)
где константное выражение даетfalse
позволяет все исключения.
Поэтому компилятор не должен различать их при рассмотрении исключений.
Что еще более важно, вам нет нужды noexcept(false)
к вашим функциям. Как разработчик C ++, вы должны предполагать, что каждая функция выбрасывает по умолчанию (именно поэтому стандарт занимает такую позицию), поэтому вы не добавляете новую информацию, выписывая ее; это пустая трата времени для всех.
Скорее, отметьте особый случай, когда функция определенно не бросает с noexcept
и отметьте случаи, когда функция может бросить в зависимости от некоторых условий с noexcept(condition)
,
Если ваша функция намеренно является источником какого-то исключения E
напишите это в своей документации.
В своей книге Больше исключительных C ++, Херб Саттер имеет следующий фрагмент (стр. 130):
Правильный ответ на Пример 19-1 намного проще:
// Example 19-4: The right solution // T::~T() /* throw() */ { // ... code that won't throw ... }
Пример 19-4 демонстрирует, как принять решение о дизайне вместо вафли.
Обратите внимание, что
throw()
спецификация исключений «ничего не выбрасывает»
это только комментарий. Это стиль, который я выбрал, чтобы следовать, частично
потому что оказывается, что спецификации исключений дают намного меньше
выгода, чем они стоят. Независимо от того, решите ли вы на самом деле написать спецификацию, это вопрос вкуса.
(акцент мой)
Итак, я чувствую, что должен указать, что один из ведущих экспертов в C ++-безопасном коде, кажется, против всей концепции добавления спецификаций исключений для использования компилятором (но все же оставляя это в коде для понимания программистами) ,
Просто подумал, что это может быть интересная информация …