Прием возврата в C++
Метод return_value получает аргумент
co_return и сохраняет его в обещании
до уничтожения кадра.
Сопрограмму доводят до конечной приостановки
через resume, затем читают поле
результата у дескриптора. Запишем
завершение числом 8 и выведем
сохраненное значение:
#include <coroutine>
#include <iostream>
struct slot {
struct promise_type {
int stored = 0;
slot get_return_object() {
return slot{
std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_value(int value) { stored = value; }
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
explicit slot(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~slot() {
if (h) {
h.destroy();
}
}
};
static slot eight() {
co_return 8;
}
int main() {
slot job = eight();
while (!job.h.done()) {
job.h.resume();
}
std::cout << job.h.promise().stored << "\n";
return 0;
}
Поле stored остается доступным, пока
дескриптор жив и сопрограмма стоит на
конечной приостановке.
Завершите сопрограмму через co_return 12,
дождитесь done и выведите поле,
куда пишет return_value.
Уничтожьте дескриптор в деструкторе обертки после чтения результата.