"noexcept" против "Бросок: ничего"

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

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

и наоборот. Несколько примеров:

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

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

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

Ответы

Ответ 1

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

Принятые рекомендации

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

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

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

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

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