Comments 6
Спасибо за статью. Стало несколько понятней, как со всем этим новьём работать. Увы, выглядит всё равно крайне сыро. Особенно "впечатлила" проблема с лямбдами. Непонятно, почему контекст лямбды должен уничтожаться, а не переходить в корутину.
То есть интеграция сопрограмм и лямбд в новом стандарте прошла у нас на ура!
Сарказм в словах ваших ощущаю я.
Непонятно, почему контекст лямбды должен уничтожаться, а не переходить в корутину.
Потому что создается временный объект и сразу запускается. Возвращается тип Task
, и после этого временный объект со всеми захваченными переменными самоуничтожается. А сопрограмма еще даже не была запущена.
В целом-то понятно, что технически лямбда и корутина - разные объекты. Вопрос в том, зачем добавили ещё одни подводные грабли. Корутина не запущена, но её контекст уже создан.
В примере ещё просто сам метод который вызывает лямбду не является корутиной, для себя сделал такое когда игрался с ними.
co_await co_fn | [&i]()
{
std::cout << i++ << ":sleep\n";
std::this_thread::sleep_for(1000ms);
std::cout << "wokeup\n";
};
Асинхронность в С++20. Доклад в Яндексе