"noexcept" vs " Throws: nothing "[закрыто]


Просматривая последние правки рабочего проекта C++0x я нашел много

  • удаление ключевого слова noexcept
  • добавление текстовых бросков: ничего на том же месте

И наоборот. Только некоторые примеры:

  • замена noexcept против бросков: ничего: 20.6.4 безопасность указателя [util.активный.безопасность] template<class T> T*undeclare_reachable(T*p);
  • добавление noexcept: 20.6.3.2. Функции-члены признаков указателя [указатель.черты.функции]: static pointer pointer_trait<T*>::pointer_to(...) noexcept;

Вопросы здесь:

  • Есть ли общее правило / шаблон, когда мы найдем noexcept против бросков: ничего в Std-Lib?
  • должны ли пользователи выводить определенное поведение по данному правилу? Т. е. Когда они должны или не должны добавлять noexcept к своим собственным функциям?
1 14

1 ответ:

В Мадриде на нас сильно повлиял N3279, который включает следующие рекомендации:

Принятые Руководящие Принципы

  • Никакой деструктор библиотеки не должен бросать. Они должны использовать неявно предоставленную спецификацию исключений (не бросающих).

  • Каждая библиотечная функция, имеющая широкий контракт, который LWG не может бросить, должна быть помечена как безусловно noexcept.

  • Если библиотека подкачки функции, move-конструктора или оператор Move-assignment является условно-широким (т. е. может быть доказано, что он не бросает, применяя оператор noexcept), то он должен быть помечен как условно noexcept. Ни одна другая функция не должна использовать условную спецификацию noexcept.

  • Библиотечные функции, предназначенные для совместимости с кодом" С " (например, средство atomics), могут быть помечены как безусловно noexcept.

Я бы не стал интерпретировать эти руководящие принципы как ориентированные на более широкую аудиторию. Это в основном признание того, что у нас есть проблемы обратной совместимости с добавлением noexcept. Если мы ошибаемся, noexcept легче добавить, чем удалить в следующем стандарте. Поэтому мы попытались применить ноэксепт, который был одновременно консервативным и систематическим.