Поскольку Coroutines TS был принят в C ++ 20 на конференции ISO в Kona, я начал немного подыгрывать им.Clang уже имеет достойную поддержку сопрограмм, но реализация поддержки библиотеки все еще отсутствует.В частности, типы Awaitable , такие как std::future
, std::generator
и т. Д., Еще не реализованы.
Таким образом, я взял на себя обязательство сделать std::future
ожидаемым.Я в значительной степени следовал за докладом Джеймса Макнеллиса на CppCon 2016 , в частности, на этом слайде:
Это был 2019 год, у меня фактически былонекоторые проблемы с (предположительно непроверенным?) кодом на этом слайде:
- Мне кажется, что перегрузка
operator co_await
больше не вещь?Вместо этого следует использовать необязательный await_transform
из promise_type
.Не уверен, что я все понял правильно. - Продолжение
then
будущего захватывает дескриптор по значению, но функция-член resume
не является константной.Я обошел это, сделав лямбду mutable
.
Кроме того, then
и is_ready
недоступны в std::future
, но являются частью std::experimental::future
который все еще отсутствует в моей версии libc ++.Чтобы избежать работы с Awaiter и реализовать будущие продолжения, я написал производный будущий класс, который является Awaitable и Awaiter.Насколько я понимаю, в конечном итоге и то, и другое будет верно и для std::future
.Вы можете увидеть мой пример в Compiler Explorer .Он компилирует .
Однако он также делает segfault.Это происходит в await_resume
, когда вызывается get()
.Это на самом деле не удивительно, поскольку valid()
возвращает false
в этот момент (совершая вызов get()
UB).Я думаю, это потому, что когда then
используется для продолжения будущего, исходный объект будущего перемещается в асинхронное будущее, что делает недействительным старое будущее (*this
во время вызова await_resume
, поэтому после перемещения),Моя реализация then
слабо вдохновлена этим ответом и этим кодом , который я нашел на GitHub.Возможно, они не идеальны, но cppreference явно заявляет valid() == false
в качестве постусловия вызова then
, поэтому я считаю правильным выйти из первоначального будущего.
Что яЯ здесь скучаю?Эта «ошибка», кажется, присутствует уже на слайде выше.Как я могу решить эту проблему?Кто-нибудь знает о (работающей) существующей реализации ожидаемого будущего?Спасибо.