Введение в сопрограммы в C++
Сопрограмма - это функция, которая может приостанавливать выполнение и позже продолжать его с того же места.
Ключевое слово co_return завершает такую
функцию. Заголовок подключают как
#include <coroutine>, а компилятор
ожидает вложенный promise_type с методом
return_void. Точки
initial_suspend и final_suspend
задают как std::suspend_never, поэтому
тело выполняется сразу до конца. Запишем
сопрограмму и вызовем ее из main:
#include <coroutine>
#include <iostream>
struct run_once {
struct promise_type {
run_once get_return_object() {
return run_once{
std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
explicit run_once(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~run_once() {
h = {};
}
run_once(const run_once&) = delete;
run_once& operator=(const run_once&) = delete;
};
static run_once hello() {
co_return;
}
int main() {
run_once job = hello();
std::cout << "ok\n";
return 0;
}
При std::suspend_never в конце кадр
сопрограммы уничтожается автоматически, а
объект результата обнуляет дескриптор, не
оставляя подвешенной сопрограммы.