LINUX.ORG.RU

История изменений

Исправление 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 под капотом может делать какую-то часть операции, но это должно быть незаметно.