Namespaces
Variants

C++ attribute: noreturn (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Указывает, что функция не возвращает управление.

Содержание

Синтаксис

[ [ noreturn ] ]

Объяснение

Указывает, что функция не вернет управление вызывающей функции после завершения (например, функции, которые завершают приложение, генерируют исключения, выполняют бесконечный цикл и т.д.). Этот атрибут применяется только к имени объявляемой функции в объявлениях функций.

Если функция, ранее объявленная с [ [ noreturn ] ] вызывается и этот вызов в конечном счете возвращает управление, поведение является неопределенным во время выполнения .

Первое объявление функции должно указывать этот атрибут, если любое объявление его указывает. Если функция объявлена с [ [ noreturn ] ] в одной единице трансляции, и та же функция объявлена без [ [ noreturn ] ] в другой единице трансляции, программа является некорректной; диагностика не требуется.

Пример

[[noreturn]] void f()
{
    throw "error";
    // OK
}
void q [[noreturn]] (int i)
{
    // поведение не определено, если вызвано с аргументом <= 0
    if (i > 0)
        throw "positive";
}
// void h() [[noreturn]]; // ошибка: атрибут применен к типу функции h, а не к самой h
int main()
{
    try { f(); } catch(...) {}
    try { q(42); } catch(...) {}
}

Стандартная библиотека

Следующие стандартные функции объявлены с атрибутом noreturn :

Функции завершения
(C++11)
вызывает нормальное завершение программы без очистки
(функция)
вызывает аварийное завершение программы (без очистки)
(функция)
вызывает нормальное завершение программы с очисткой
(функция)
(C++11)
вызывает быстрое завершение программы без полной очистки
(функция)
функция, вызываемая при неудачной обработке исключений
(функция)
(устарело в C++11) (удалено в C++17)
функция, вызываемая при нарушении динамической спецификации исключений
(функция)
Подсказки компилятору
отмечает недостижимую точку выполнения
(функция)
Всегда выбрасывающие функции
выбрасывает исключение из std::exception_ptr
(функция)
выбрасывает сохранённое исключение
(публичная функция-член std::nested_exception )
выбрасывает свой аргумент с добавлением 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]]