Почему возвращаемый тип заполнителя не разрешен для сопрограмм?


person xmllmx    schedule 08.08.2019    source источник


Ответы (1)


Механизм сопрограммы, который используется для конкретной сопрограммы, основан главным образом на типе возвращаемого значения функции. Тип возвращаемого значения — будущее сопрограммы, из которого логика сопрограммы выведет объект обещания сопрограммы, который будет использоваться для передачи фактических значений, сгенерированных сопрограммой, вызывающей стороне через возвращаемое будущее.

Это означает, что из co_await, co_yield и co_return ни один из них на самом деле не использует возвращаемый тип сопрограммы (кстати, именно поэтому co_return пишется иначе, чем return; у него другое значение и поведение , поэтому он получает другое ключевое слово). co_return и co_yield не дают самого будущего типа; им дается тип, который обещание/будущее может передать пользователю.

И тип выражения co_await почти не имеет отношения к обещанию/будущему сопрограммы. Это просто значение, с помощью которого сопрограмма может планировать свое возобновление и из которого можно извлечь значение произвольного типа. Запланированное возобновление на самом деле не очень заботится о конкретном будущем/обещании текущей сопрограммы. Вы можете co_await на std::future<T>, даже если тип будущего/обещания вашей сопрограммы не является std::future каким-либо видом.

Таким образом, невозможно вывести, каким должно быть будущее/обещание сопрограммы, из выражения, предоставленного любому из этих ключевых слов. Следовательно, вы должны указать это явно.

person Nicol Bolas    schedule 08.08.2019