noexcept (C++)

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

Синтаксис

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

Параметры

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

Замечания

Это noexcept-expression тип спецификации исключения: суффикс в объявление функции, представляющее набор типов, которые могут соответствовать обработчику исключений для любого исключения, выходя из функции. Унарный условный оператор noexcept(constant_expression) при constant_expression получении trueи его безусловный синоним noexceptуказывают, что набор потенциальных типов исключений, которые могут выйти из функции, пуста. То есть функция никогда не создает исключение и никогда не позволяет распространять исключение за пределами его область. Оператор 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)