return_value получает аргумент co_return и сохраняет его в обещании до уничтожения кадра. Сопрограмму доводят до конечной приостановки через resume.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpCrRv 584 of 696 menu
◀ ▶

Прием возврата в 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.

Уничтожьте дескриптор в деструкторе обертки после чтения результата.

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