Возврат из сопрограммы в C++
Ключевое слово co_return с выражением
передает итоговое значение через метод
return_value в promise_type.
Для такого завершения вместо return_void
нужен return_value, принимающий тип
результата. Запишем сопрограмму, которая
завершается числом 5, и выведем
сохраненное поле:
#include <coroutine>
#include <iostream>
struct answer {
struct promise_type {
int result = 0;
answer get_return_object() {
return answer{
std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_value(int value) { result = value; }
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
explicit answer(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~answer() {
h = {};
}
answer(const answer&) = delete;
answer& operator=(const answer&) = delete;
};
static answer five() {
co_return 5;
}
int main() {
answer job = five();
std::cout << job.h.promise().result << "\n";
return 0;
}
Поле result заполняется до того, как
управление вернется в main, потому
что обе точки приостановки настроены на
немедленное выполнение.
Сделайте сопрограмму с co_return 9
и полем result в обещании. Выведите
это поле после вызова.
Добавьте в promise_type метод
return_value для int и
убедитесь, что return_void при
таком сценарии не используется.