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
)