Почему noexcept больше не используется в стандартной библиотеке?

Поскольку noexcept был введен и рассмотрен многие проблемы с throw(), теперь есть причина указать, не вызывает ли функция исключение. Хотя это не ограничение времени компиляции, это позволит некоторым потенциальным оптимизациям компилятором, а если ничего больше, сигнализация и документация, значение для пользователя функции.

В свете этого я был немного удивлен, когда просмотрел стандартные функции, такие как: std::time, std::timespec_get и std::memcmp и увидел, что ни один из них использовал спецификатор noexcept. Это не похоже на отсутствие каких-либо функций, используемых в стандартной библиотеке, например, функция std::tie использует ее, а другие - как Что ж. Но большая часть функций не использует его.

Я думаю, что это имеет смысл для функций, которые имеют поведение undefined в определенных ситуациях, например std::strlen, поскольку это позволит разработчикам больше свободы.

Но для функций, где нет заданных ситуаций, которые могут привести к поведению undefined и которые явно не генерируют исключений, почему эти функции не будут объявлены с помощью спецификатора noexcept?

Это может быть связано не только с сохранением сходства со старыми функциями C, поскольку, например, std::timespec_get является новой функцией в С++ 11, поэтому она должна быть по какой-то другой причине.

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

Что приводит меня к моей последней гипотезе, что отсутствующие спецификаторы noexcept в стандартной библиотеке - это действительно надзоры, как это было в случае с missing std::make_unique. Но в отличие от отсутствующего std::make_unique, который был исправлен (реализован) в С++ 14, функции выше, до сих пор не были выполнены (как на С++ 17) noexcept.

Кто-нибудь знает аргументы за отсутствующими спецификаторами noexcept, или я прав, думая, что это недосмотр?

Ответы

Ответ 1

Перефразируя то, что вы написали выше,

как вы можете гарантировать noexcept, когда вещи передаются указателями?

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