noexcept (C++)

C++11: Указывает, может ли функция создавать исключения.

Синтаксис

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

Параметры

constant-expression
Константное выражение типа bool , представляющее, является ли набор потенциальных типов исключений пустым. Безоговорочная версия эквивалентна noexcept(true).

Комментарии

A noexcept-expression — это своего рода спецификация исключения: суффикс объявления функции, представляющий набор типов, которые могут быть сопоставлены обработчиком исключений для любого исключения, выходя из функции. Унарный условный оператор noexcept(constant_expression) при получении и trueего безусловном синониме noexceptуказывают, что набор потенциальных типов исключений, которые могут выйти из constant_expression функции, пуст. То есть функция никогда не создает исключение и никогда не разрешает распространение исключения за пределы его области. Оператор noexcept(constant_expression) при constant_expression получении falseили отсутствии спецификации исключения (кроме деструктора или функции освобождения) указывает, что набор потенциальных исключений, которые могут выйти из функции, является набором всех типов.

Пометьте функцию как noexcept только в том случае, если все функции, которые он вызывает напрямую или косвенно, также noexcept или const. Компилятор не обязательно проверяет каждый путь кода на наличие исключений, которые могут выполняться до noexcept функции. Если исключение выходит из внешней области функции, помеченной как помеченная noexcept, std::terminate вызывается немедленно, и нет никакой гарантии, что деструкторы любых объектов в области будут вызваны. Используйте noexcept вместо описателя throw()динамического исключения. Спецификация динамического исключения или throw(optional_type_list) спецификация устарела в C++11 и удалена в C++17, за исключением throw()псевдонима.noexcept(true) Мы рекомендуем применить к noexcept любой функции, которая никогда не разрешает распространение исключения по стеку вызовов. Если функция объявлена noexcept, компилятор может создавать более эффективный код в нескольких разных контекстах. Дополнительные сведения см. в спецификациях исключений.

Пример

Шаблон функции, копирующий его аргумент, может быть объявлен noexcept в условии, что копируемый объект является обычным старым типом данных (POD). Такая функция может быть объявлена следующим образом:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
   // ...
}

См. также раздел

Современные рекомендации C++ по обработке исключений и ошибок
Спецификации исключений (throw, noexcept)