Может ли сопрограмма вернуть std::future? (не удалось найти тип промиса для этой сопрограммы)

Я попытался скомпилировать пример сопрограммы из презентации CppCon https://youtu.be/ZTqHjjm86Bw?t=560

введите здесь описание изображения

К сожалению, компиляция не удалась:

$ g++-10 -pedantic -Wall -std=c++20 -fcoroutines main.cpp 
main.cpp: In function ‘std::future<int> compute_value()’:
main.cpp:7:16: error: unable to find the promise type for this coroutine
    7 |   int result = co_await std::async([]
      |                ^~~~~~~~

В начале ведущий предупреждает, что то, что он собирается представить, является всего лишь предложением. Так что это меня смущает: может ли std::future возвращаться из сопрограммы, или я просто пытаюсь вызвать ее неправильно?

Полный код:

#include <coroutine>
#include <iostream>
#include <future>

std::future<int> compute_value(){
  int result = co_await std::async([] 
  {
    return 30;
  });

  co_return result;
}

int main() {
    std::cout << compute_value().get() << std::endl;
}

person user2449761    schedule 08.02.2021    source источник


Ответы (1)


В C++20 нет (в основном1) стандартных типов библиотек, которые реализуют необходимый механизм сопрограмм для работы сопрограмм. Это включает std::promise<T>/future<T>.

Однако вы можете написать для них обертки, которые реализуют механизм сопрограммы.

1: существуют типы поддержки, такие как std::suspend_always/never, которые имеют сопрограмму. машины, но на самом деле они не делают ничего подобного тому, о чем вы думаете.

person Nicol Bolas    schedule 08.02.2021
comment
Я полагаю, что сопрограмма machinery и стандартная библиотека support состоят из двух частей, поэтому одна не блокирует другую. - person Yakk - Adam Nevraumont; 08.02.2021
comment
так что в будущем я смогу вернуть std::future из сопрограммы? - person user2449761; 08.02.2021
comment
@ user2449761: Возможно. Они могут использовать другой тип, специфичный для этого варианта использования. - person Nicol Bolas; 08.02.2021