ну в смысле? Компилятор видит два return_void и return_value одновременно и ноет
В разных ветках?
Наверное, технически это ничему не противоречит, но мне кажется такой дизайн мягко говоря странным. Если корутина возвращает значение, return не должен быть пустым. То есть пока я на стороне стандарта.
С другой стороны, то что разрешены перегрузки, тоже ломает логику обычной функции, где тип возвращаемого значения один.
У вас любая Task уже умеет обрабатывать эксепшн (как правило сохраняя его в exception_ptr поле/варианте). Как минимум можно представить случай когда вы не хотите кидать эксепшн а сразу хотите вернуть Хотя более практичное соображение на мой взгляд это кенсел корутины со стороны промиса co_return StopTag{}; Сейчас вы можете поддержать такое поведение для T!=void, а для void надо либо кидать эксепшн (что дорого), либо делать сo_await Stop() который никогда не вернеться, что можно но некрасиво и неявно
И это хорошо например я могу реализовать return_value(Task<T>) эффективнее чем co_return co_await task
А как работает решение со StopTag? Возврат чего-то типа Either T StopTag и кастомный operator await, который делает что-то вроде if (Right _) return StopTag; (не уверен, что это возможно)?
Ну внутри Task условно variant<T,...,StopTag>, в него сохраняется вместо T, StopTag, остальное не отличается. Или вопрос про решение co_await Stop()/StopTag{}?
Отмена это про раскрутку всего стэка. Отмена одной футуры никому не интересна.
Ну так она прокинется дальше
у тебя что за компилятор?
clang и gcc, вроде msvc также пишет, но не првоерял
Обсуждают сегодня