initial_suspend решает, стартует ли тело сразу после создания кадра или ждет первого resume. Если метод возвращает std::suspend_always.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpCrIs 581 of 696 menu
◀ ▶

Начальная приостановка в 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.

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