Spec-Zone.ru › C++

Атрибут 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:

Функции завершения
_Exit
(C++11)
вызывает нормальное завершение программы без очистки
(функция)
abort
вызывает аварийное завершение программы (без очистки)
(функция)
exit
вызывает нормальное завершение программы с очисткой
(функция)
quick_exit
(C++11)
вызывает быстрое завершение программы без полной очистки
(функция)
terminate
функция, вызываемая при сбое обработки исключения
(функция)
unexpected
(устарело в C++11)(удалено в C++17)
функция, вызываемая при нарушении динамической спецификации исключений
(функция)
Подсказки компилятору
unreachable
(C++23)
помечает недостижимую точку выполнения
(функция)
Функции, всегда выбрасывающие исключение
rethrow_exception
(C++11)
выбрасывает исключение из std::exception_ptr
(функция)
rethrow_nested
выбрасывает сохранённое исключение
(открытая функция-член std::nested_exception)
throw_with_nested
(C++11)
выбрасывает свой аргумент, добавляя к нему std::nested_exception
(шаблон функции)
Нелокальные переходы (начиная с C++17)
longjmp
переходит в указанное место
(функция)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API