Работает ли co_await в Visual Studio 2015 Update 3 с std :: эксперимент :: :: по желанию

в интернете есть ссылки [1,2] предполагая, что co_await должен работать с std::experimental::optional и что VS 2015 Update 2 должен это поддерживать.
Поскольку VS не имеет опционально даже в обновлении 3, я использую один из GitHub, но такой код не компилируется:

optional<string> get_hope() {
if ((rand() % 4) == 0)
return nullopt;
return "yolo";
}

optional<string> bla() {
string s = co_await get_hope();
}

Ошибка:

Ошибка (активная) это выражение co_await требует подходящего
функция «await_ready» и ни один не был найден

Поэтому мой вопрос: я делаю что-то не так, в библиотеке отсутствует поддержка await или в компиляторе отсутствует поддержка этого аспекта co_await,

0

Решение

в интернете есть несколько ссылок [1,2], предлагающих, чтобы co_await работал с std :: эксперимент :: :: по желанию

Вы неправильно интерпретируете эти ссылки. Хотя по общему признанию этот по сути предназначенный создать эту неверную интерпретацию.

P0057 «сопрограммы» по сути, это способ для функции приостановить свое выполнение и быть продолженным с точки приостановки через некоторое время. Механизм, вызывающий это, включает ряд сложных взаимодействий между возвращаемым типом / сигнатурой функции и типом выражения, являющегося co_awaitизд.

То, что люди обнаружили, это способ абиспользование co_await выполнить эффективный эквивалент условного возврата. Вы могли бы иметь co_awaitприменительно к optional, проверить optionalсостояние и просто выйдите из функции, если она пуста. В результате, co_await сказал бы приостановить функцию (таким образом, возвращая управление вызывающей стороне), но никогда не планируйте его возобновление. Это создает эффект возврата (включая очистку сопрограммы) без фактического написания if(opt.empty()) return; else ..., Это также позволяет co_await распаковать значение из optional если значение было сохранено в нем.

Однако это происходит не просто волшебно, потому что optional существует. Вы должны построить специальные co_await техника, которая работает как с optional как co_await тип выражения и любой тип возвращаемого значения функции, в которой он используется.

VS2015 реализация co_await предоставляет эту технику для co_awaitна std::future, Но у него нет такой поддержки optional или другие случайные типы. Вы должны создать его самостоятельно, на что не указывает ни один из цитируемых вами постов.

2

Другие решения

Других решений пока нет …