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
)
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по