Ключевое слово co_return
Ключевое слово co_return используется
внутри корутин для возврата значения и
завершения выполнения корутины. В отличие
от обычного return, который просто
возвращает управление и значение из функции,
co_return выполняет специальные действия:
сохраняет возвращаемое значение в объекте
обещания (promise), вызывает метод
return_value или return_void,
а затем освобождает фрейм корутины.
Ключевое слово co_return может
использоваться в трёх формах: без выражения
(для корутин, возвращающих void),
с выражением (для возврата значения) и
с фигурными скобками для списка инициализации.
В первом параметре указывается возвращаемое
значение, если оно есть.
Синтаксис
co_return;
co_return expression;
co_return { expression-list };
Пример
Рассмотрим простой пример корутины, которая
возвращает число 42 с помощью
co_return. Для работы с корутинами
требуется подключить заголовок
<coroutine>:
#include <iostream>
#include <coroutine>
using namespace std;
struct Task
{
struct promise_type
{
Task get_return_object()
{
return Task{};
}
suspend_never initial_suspend()
{
return {};
}
suspend_never final_suspend() noexcept
{
return {};
}
void return_void()
{
}
void unhandled_exception()
{
}
};
};
Task coro()
{
cout << "Start" << endl;
co_return;
cout << "Never reached" << endl;
}
int main()
{
coro();
return 0;
}
Результат выполнения кода:
"Start"
Пример
Теперь рассмотрим корутину, которая
возвращает значение 123 через
co_return. Для этого в объекте
обещания должен быть определён метод
return_value:
#include <iostream>
#include <coroutine>
using namespace std;
struct Task
{
struct promise_type
{
int value = 0;
Task get_return_object()
{
return Task{};
}
suspend_never initial_suspend()
{
return {};
}
suspend_never final_suspend() noexcept
{
return {};
}
void return_value(int v)
{
value = v;
}
void unhandled_exception()
{
}
};
};
Task coro()
{
co_return 123;
}
int main()
{
coro();
cout << "Done" << endl;
return 0;
}
Результат выполнения кода:
"Done"
Пример
Также co_return можно использовать
с фигурными скобками для возврата списка
инициализации, например для возврата строки
"abcde":
#include <iostream>
#include <coroutine>
#include <string>
using namespace std;
struct Task
{
struct promise_type
{
string value;
Task get_return_object()
{
return Task{};
}
suspend_never initial_suspend()
{
return {};
}
suspend_never final_suspend() noexcept
{
return {};
}
void return_value(string v)
{
value = v;
}
void unhandled_exception()
{
}
};
};
Task coro()
{
co_return string{"abcde"};
}
int main()
{
coro();
cout << "Done" << endl;
return 0;
}
Результат выполнения кода:
"Done"