get_return_object возвращает объект, который представляет сопрограмму снаружи - обычно обертку над std::coroutine_handle.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpCrRo 580 of 696 menu
◀ ▶

Объект результата в 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" из тела. Запустите и сравните порядок строк.

Сохраните дескриптор в поле обертки и уничтожьте его в деструкторе после завершения сопрограммы.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить