в интернете есть ссылки [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
,
в интернете есть несколько ссылок [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
или другие случайные типы. Вы должны создать его самостоятельно, на что не указывает ни один из цитируемых вами постов.
Других решений пока нет …