nothrow (C++)

Блок, относящийся только к системам Майкрософт

Расширенный __declspec атрибут, который можно использовать в объявлении функций.

Синтаксис

return-type__declspec(nothrow) [call-convention] function-name ([argument-list])

Замечания

Рекомендуется, чтобы весь новый код использовал noexcept оператор, а не __declspec(nothrow).

Этот атрибут сообщает компилятору, что и объявленная функция, и функции, которые она вызывает, никогда не создают исключений. Однако директива не применяется. Другими словами, он никогда не вызывает std::terminate вызов, в отличие noexceptот режима или в std:c++17 режиме (Visual Studio 2017 версии 15.5 и более поздних версий), throw().

Поскольку по умолчанию теперь используется модель синхронной обработки исключений, то компилятор может исключить механизм, позволяющий отслеживать время существования удаляемых объектов в такой функции, и значительно уменьшить объем кода. Учитывая следующую директиву препроцессора, три объявления функций ниже эквивалентны в /std:c++14 режиме:

#define WINAPI __declspec(nothrow) __stdcall

void WINAPI f1();
void __declspec(nothrow) __stdcall f2();
void __stdcall f3() throw();

В /std:c++17 режиме не эквивалентен другим, которые используются__declspec(nothrow), throw() так как вызываетсяstd::terminate, если исключение создается из функции.

Объявление void __stdcall f3() throw(); использует синтаксис, определенный стандартом C++. В C++17 throw() ключевое слово не рекомендуется.

Завершение блока, относящегося только к системам Майкрософт

См. также

__declspec
noexcept
Ключевые слова