Как стать автором
Обновить

Комментарии 6

Спасибо за статью. Стало несколько понятней, как со всем этим новьём работать. Увы, выглядит всё равно крайне сыро. Особенно "впечатлила" проблема с лямбдами. Непонятно, почему контекст лямбды должен уничтожаться, а не переходить в корутину.


То есть интеграция сопрограмм и лямбд в новом стандарте прошла у нас на ура!

Сарказм в словах ваших ощущаю я.

Непонятно, почему контекст лямбды должен уничтожаться, а не переходить в корутину.

Потому что создается временный объект и сразу запускается. Возвращается тип Task, и после этого временный объект со всеми захваченными переменными самоуничтожается. А сопрограмма еще даже не была запущена.

В целом-то понятно, что технически лямбда и корутина - разные объекты. Вопрос в том, зачем добавили ещё одни подводные грабли. Корутина не запущена, но её контекст уже создан.

В примере ещё просто сам метод который вызывает лямбду не является корутиной, для себя сделал такое когда игрался с ними.

co_await co_fn | [&i]()
{
  std::cout << i++ << ":sleep\n";
  std::this_thread::sleep_for(1000ms);
  std::cout << "wokeup\n";
};

Я понимаю, что эту проблему можно обойти. Можно дописать хелпер. Загвоздка в том, что это ещё одно "плохое" поведение по умолчанию, которых в С++ и так хватает.

Ну на самом деле можно написать и

co_await []{}

С обычным Awaitable, но я считаю что это не очень красиво.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.