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 | - | заключённый в фигурные скобки список инициализаторов и других списков инициализаторов |
Объяснение
void, и запрещено в конструкторах и деструкторах.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 является допустимым для перемещения, если это (возможно, с круглыми скобками) идентификатор, обозначающий переменную автоматического хранения, тип которой
и переменная объявлена
| (с C++11) |
Гарантированное исключение копированияЕсли expression является выражением-rvalue, объект-результат инициализируется непосредственно этим выражением. Это не требует копирующего или перемещающего конструктора, когда типы совпадают (см. исключение копирования). | (с C++17) |
| Макрос проверки функции | Значение | Std | Функция |
|---|---|---|---|
__cpp_implicit_move | 202207L | (C++23) | Более простой неявный возврат |
Ключевые слова
Пример
#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