Объект результата в C++
Метод get_return_object возвращает
объект, который представляет сопрограмму
снаружи - обычно обертку над
std::coroutine_handle.
Дескриптор берут через
std::coroutine_handle<promise_type>::from_promise,
передавая ссылку на текущее обещание.
Запишем вывод в get_return_object
и слово в теле, чтобы сравнить порядок:
#include <coroutine>
#include <iostream>
struct shell {
struct promise_type {
shell get_return_object() {
std::cout << "wrap\n";
return shell{
std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
explicit shell(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~shell() {
if (h) {
h.destroy();
}
}
};
static shell order() {
std::cout << "body\n";
co_return;
}
int main() {
shell job = order();
while (!job.h.done()) {
job.h.resume();
}
return 0;
}
Сначала на экране оказывается "wrap",
а "body" - уже после resume,
когда разрешено начальное ожидание.
Выведите слово "make" из
get_return_object и слово
"go" из тела. Запустите и сравните
порядок строк.
Сохраните дескриптор в поле обертки и уничтожьте его в деструкторе после завершения сопрограммы.