co_return с выражением передает итоговое значение через метод return_value в promise_type. Для такого завершения вместо return_void нужен.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpCrRn 577 of 696 menu
◀ ▶

Возврат из сопрограммы в 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 при таком сценарии не используется.

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