История изменений
Исправление KivApple, (текущая версия) :
Ты не должен ничего доставать из очереди до co_await. Извлечение чего-то из очереди меняет состояние очереди видимое для всех и это может иметь далеко идущие последствия (кто-то другой теперь не получит этот элемент). Пользователь твоей библиотеки должен иметь чёткое представление когда именно это изменение состояния произойдёт (на какой именно строчке), а не «когда-нибудь, может тут, может там». От примитивов синхронизации требуется предсказуемость, иначе зачем они вообще нужны.
Представь, что юзер захочет между вызовом функции и co_await сделать early return (справедливо предполагая, что до co_await очередь никто не трогал, потому что такова парадигма асинхронности в плюсах). Или у него что-нибудь бросит исключение. Так или иначе до co_await функция не дойдёт и элемент очереди будет потерян. Избежать это можно лишь жёстким требованием «всегда писать co_await receive() в одну строчку», но это выглядит как мегакостыль.
Исходная версия KivApple, :
Ты не должен ничего доставать из очереди до co_await. Извлечение чего-то из очереди меняет состояние очереди видимое для всех и это может иметь далеко идущие последствия (кто-то другой теперь не получит этот элемент). Пользователь твоей библиотеки должен иметь чёткое представление когда именно это изменение состояния произойдёт (на какой именно строчке), а не «когда-нибудь, может тут, может там». От примитивов синхронизации требуется предсказуемость, иначе зачем они вообще нужны.