История изменений
Исправление KivApple, (текущая версия) :
Ну вот и мой ответ: в языках с ленивыми корутинами (C++, Rust и т. д.) видимое извне изменение состояния (например, удаление элемента из очереди) должно происходить при await. При самом создании корутины может происходить какая-то подготовка к операции, но последствия этой подготовки должны быть невидимы для пользователя библиотеки.
Иными словами:
auto a = f();
auto b = f();
auto aResult = co_await a;
auto bResult = co_await b;
std::cout << aResult << std::endl << bResult << std::endl;
И:
auto b = f();
auto a = f();
auto aResult = co_await a;
auto bResult = co_await b;
std::cout << aResult << std::endl << bResult << std::endl;
Должны давать идентичный результат. При этом f под капотом может делать какую-то часть операции (например, регистрировать какого-нибудь слушателя, запоминать состояние и т. п.), но это должно быть незаметно.
Исправление KivApple, :
Ну вот и мой ответ: в языках с ленивыми корутинами (C++, Rust и т. д.) видимое извне изменение состояния (например, удаление элемента из очереди) должно происходить при await. При самом создании корутины может происходить какая-то подготовка к операции, но последствия этой подготовки должны быть невидимы для пользователя библиотеки.
Иными словами:
auto a = f();
auto b = f();
auto aResult = co_await a;
auto bResult = co_await b;
std::cout << aResult << std::endl << bResult << std::endl;
И:
auto b = f();
auto a = f();
auto aResult = co_await a;
auto bResult = co_await b;
std::cout << aResult << std::endl << bResult << std::endl;
Должны давать идентичный результат. При этом f под капотом может делать какую-то часть операции, но это должно быть незаметно.
Исходная версия KivApple, :
Ну вот и мой ответ: в языках с ленивыми корутинами (C++, Rust и т. д.) видимое извне изменение состояния (например, удаление элемента из очереди) должно происходить при await. При самом создании корутины может происходить какая-то подготовка к операции, но последствия этой подготовки должны быть невидимы для пользователя библиотеки.
Иными словами:
auto a = f();
auto b = f();
auto aResult = co_await a;
auto bResult = co_await b;
std::cout << aResult << std::endl;
И:
auto b = f();
auto a = f();
auto aResult = co_await a;
auto bResult = co_await b;
std::cout << aResult << std::endl;
Должны давать идентичный результат. При этом f под капотом может делать какую-то часть операции, но это должно быть незаметно.