Spec-Zone.ru › C++

return оператор

Прерывает выполнение текущей функции и возвращает указанное значение (если оно есть) вызывающей функции.

Синтаксис

attr (необязательно) return expression (необязательно) ; (1)
attr (необязательно) return braced-init-list ; (2) (с C++11)
attr (необязательно) co_return expression (необязательно) ; (3) (с C++20)
attr (необязательно) co_return braced-init-list ; (4) (с C++20)
attr - (с C++11) последовательность любого числа атрибутов
expression - выражение, преобразуемое к типу возвращаемого значения функции
braced-init-list - заключённый в фигурные скобки список инициализаторов и других списков инициализаторов

Объяснение

1) Вычисляет expression, прерывает текущую функцию и возвращает результат expression вызывающей функции после неявного преобразования к типу возвращаемого значения. expression необязательно для функций, тип возврата которых (возможно, с квалификаторами cv) void, и запрещено в конструкторах и деструкторах.
2) Использует инициализацию списком для построения возвращаемого значения функции.
3,4) В корутине ключевое слово co_return должно использоваться вместо return для конечной точки приостановки (см. корутины для деталей).

Существует точка последовательности между копирующей инициализацией результата вызова функции и уничтожением всех временных объектов в конце expression.

(до C++11)

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

(с C++11)

Примечания

Если выполнение доходит до конца

  • функции с типом возврата (возможно, с cv-квалификаторами) void,
  • конструктора,
  • деструктора или
  • блока обработки исключений для функции с типом возврата (возможно, с cv-квалификаторами) void

без выполнения оператора return, выполняется return;.

Если выполнение доходит до конца функции main, выполняется return 0;.

Выход за пределы возвращающей значение функции, за исключением main, и определённых корутин(с C++20) без оператора return приводит к неопределённому поведению.

В функции, возвращающей (возможно, с cv-квалификаторами) void, оператор return с expression можно использовать, если тип выражения (возможно, с cv-квалификаторами) void.

Если тип возврата функции задан как заполнитель типа, он будет выведен из возвращаемого значения.

(с C++14)

Возврат по значению может включать построение и копирование/перемещение временного объекта, если не используется исключение копирования. В частности, условия для копирования/перемещения следующие:

Автоматическое перемещение из локальных переменных и параметров

expression является допустимым для перемещения, если это (возможно, с круглыми скобками) идентификатор, обозначающий переменную автоматического хранения, тип которой

  • является типом объекта без модификатора volatile
  • или является типом неквалифицированной ссылки на объект без модификатора volatile
(с C++20)

и переменная объявлена

  • в теле или
  • в качестве параметра
внутреннего окружающего функции или лямбда-выражения.

Если expression допустим для перемещения, разрешение перегрузки для выбора конструктора для инициализации возвращаемого значения или, для co_return, для выбора перегрузки promise.return_value()(с C++20) выполняется дважды:

  • сначала как если бы expression было выражением-ссылочной ссылкой (поэтому может быть выбран перемещающий конструктор), и
    • если первое разрешение перегрузки не удалось или
  • оно успешно, но не выбрал перемещающий конструктор (формально, первый параметр выбранного конструктора не был ссылкой-rvalue на (возможно, cv-квалифицированный) тип expression)
(до C++20)
  • затем разрешение перегрузки выполняется как обычно, с expression рассматриваемым как lvalue (поэтому может быть выбран копирующий конструктор).
(до C++23)

Если expression допустим для перемещения, он обрабатывается как xvalue (поэтому разрешение перегрузки может выбрать перемещающий конструктор).

(с C++23)
(с C++11)

Гарантированное исключение копирования

Если expression является выражением-rvalue, объект-результат инициализируется непосредственно этим выражением. Это не требует копирующего или перемещающего конструктора, когда типы совпадают (см. исключение копирования).

(с C++17)
Макрос проверки функции Значение Std Функция
__cpp_implicit_move 202207L (C++23) Более простой неявный возврат

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

return, co_return

Пример

#include <iostream>
#include <string>
#include <utility>
 
void fa(int i)
{
    if (i == 2)
        return;
    std::cout << "fa("<< i << ")\n";
} // implied return;
 
int fb(int i)
{
    if (i > 4)
        return 4;
    std::cout << "fb(" << i << ")\n";
    return 2;
}
 
std::pair<std::string, int> fc(const char* p, int x)
{
    return {p, x};
}
 
void fd()
{
    return fa(10); // fa(10) is a void expression
}
 
int main()
{
    fa(1); // prints its argument, then returns
    fa(2); // does nothing when i == 2, just returns
 
    int i = fb(5); // returns 4
    i = fb(i);     // prints its argument, returns 2
    std::cout << "i = " << i << '\n'
              << "fc(~).second = " << fc("Hello", 7).second << '\n';
 
    fd();
}

Вывод:

fa(1)
fb(4)
i = 2
fc(~).second = 7
fa(10)

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

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применимо к Поведение, как опубликовано Правильное поведение
CWG 1541 C++98 expression не мог быть опущен, если тип возврата был с квалификатором cv void он может быть опущен
CWG 1579 C++11 возврат с использованием перемещающего конструктора не разрешался разрешение поиска перемещающего
конструктора разрешено
CWG 1885 C++98 порядок уничтожения автоматических переменных не был явным правила последовательности добавлены

См. также

  • исключение копирования
C документация для return оператор

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/return

Spec-Zone.ru

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