Начальная приостановка в C++
Точка initial_suspend решает, стартует
ли тело сразу после создания кадра или ждет
первого resume.
Если метод возвращает std::suspend_always,
первая строка тела не выполняется, пока
внешний код не возобновит сопрограмму.
Запишем вывод внутри сопрограммы и проверим
момент появления строки:
#include <coroutine>
#include <iostream>
struct late {
struct promise_type {
late get_return_object() {
return late{
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 late(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~late() {
if (h) {
h.destroy();
}
}
};
static late start() {
std::cout << "inside\n";
co_return;
}
int main() {
late job = start();
job.h.resume();
while (!job.h.done()) {
job.h.resume();
}
return 0;
}
Строка "inside" следует за вызовом
сопрограммы только потому, что resume
снял начальную приостановку.
Верните из initial_suspend
std::suspend_always и выведите
"start" из тела после одного
resume.