Атрибут C++: noreturn (начиная с C++11)
Указывает, что функция не возвращает управление.
Синтаксис
[[noreturn]] |
Пояснение
Указывает, что после завершения функция не вернёт управление вызывающей функции (например, функции, завершающие приложение, выбрасывающие исключения, выполняющиеся бесконечно и т. д.). Этот атрибут применяется только к имени функции, объявляемой в объявлении функции.
Если вызывается функция, ранее объявленная с атрибутом [[noreturn]], и этот вызов в итоге возвращает управление, поведение является неопределённым во время выполнения.
Первое объявление функции должно указывать этот атрибут, если он указан в любом из объявлений. Если функция объявлена с атрибутом [[noreturn]] в одной единице трансляции, а в другой единице трансляции та же функция объявлена без атрибута [[noreturn]], программа некорректна; диагностика не требуется.
Пример
[[noreturn]] void f()
{
throw "error";
// OK
}
void q [[noreturn]] (int i)
{
// behavior is undefined if called with an argument <= 0
if (i > 0)
throw "positive";
}
// void h() [[noreturn]]; // error: attribute applied to function type of h, not h itself
int main()
{
try { f(); } catch(...) {}
try { q(42); } catch(...) {}
}
Стандартная библиотека
Следующие стандартные функции объявлены с атрибутом noreturn:
Функции завершения |
|
|
(C++11) | вызывает нормальное завершение программы без очистки (функция) |
| вызывает аварийное завершение программы (без очистки) (функция) |
|
| вызывает нормальное завершение программы с очисткой (функция) |
|
|
(C++11) | вызывает быстрое завершение программы без полной очистки (функция) |
| функция, вызываемая при сбое обработки исключения (функция) |
|
|
(устарело в C++11)(удалено в C++17) | функция, вызываемая при нарушении динамической спецификации исключений (функция) |
Подсказки компилятору |
|
|
(C++23) | помечает недостижимую точку выполнения (функция) |
Функции, всегда выбрасывающие исключение |
|
|
(C++11) | выбрасывает исключение из std::exception_ptr (функция) |
| выбрасывает сохранённое исключение (открытая функция-член std::nested_exception) |
|
|
(C++11) | выбрасывает свой аргумент, добавляя к нему std::nested_exception (шаблон функции) |
Нелокальные переходы (начиная с C++17) |
|
| переходит в указанное место (функция) |
|
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| CWG 2924 | C++11 | возврат из функции [[noreturn]] приводил к неопределённому поведению | приводит к неопределённому поведению во время выполнения |
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
- 9.12.10 Атрибут noreturn [dcl.attr.noreturn]
- Стандарт C++20 (ISO/IEC 14882:2020):
- 9.12.9 Атрибут noreturn [dcl.attr.noreturn]
- Стандарт C++17 (ISO/IEC 14882:2017):
- 10.6.8 Атрибут noreturn [dcl.attr.noreturn]
- Стандарт C++14 (ISO/IEC 14882:2014):
- 7.6.3 Атрибут noreturn [dcl.attr.noreturn]
- Стандарт C++11 (ISO/IEC 14882:2011):
- 7.6.3 Атрибут noreturn [dcl.attr.noreturn]
См. также
Документация по C для _Noreturn |
|
Документация по C для [[noreturn]] |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/attributes/noreturn