Согласно спецификации сопрограмм C++20 а>:
Функция, объявленная с возвращаемым типом, который использует тип заполнителя, не должна быть сопрограммой.
Почему в таком случае нельзя использовать заполнитель?
Согласно спецификации сопрограмм C++20 а>:
Функция, объявленная с возвращаемым типом, который использует тип заполнителя, не должна быть сопрограммой.
Почему в таком случае нельзя использовать заполнитель?
Механизм сопрограммы, который используется для конкретной сопрограммы, основан главным образом на типе возвращаемого значения функции. Тип возвращаемого значения — будущее сопрограммы, из которого логика сопрограммы выведет объект обещания сопрограммы, который будет использоваться для передачи фактических значений, сгенерированных сопрограммой, вызывающей стороне через возвращаемое будущее.
Это означает, что из co_await
, co_yield
и co_return
ни один из них на самом деле не использует возвращаемый тип сопрограммы (кстати, именно поэтому co_return
пишется иначе, чем return
; у него другое значение и поведение , поэтому он получает другое ключевое слово). co_return
и co_yield
не дают самого будущего типа; им дается тип, который обещание/будущее может передать пользователю.
И тип выражения co_await
почти не имеет отношения к обещанию/будущему сопрограммы. Это просто значение, с помощью которого сопрограмма может планировать свое возобновление и из которого можно извлечь значение произвольного типа. Запланированное возобновление на самом деле не очень заботится о конкретном будущем/обещании текущей сопрограммы. Вы можете co_await
на std::future<T>
, даже если тип будущего/обещания вашей сопрограммы не является std::future
каким-либо видом.
Таким образом, невозможно вывести, каким должно быть будущее/обещание сопрограммы, из выражения, предоставленного любому из этих ключевых слов. Следовательно, вы должны указать это явно.