Несколько ошибок:
Первое - обещание должно возвращать объект генератора, а не ссылку на самого себя. Итак, правильный путь:
struct HelloWorldPromise
{
...
auto get_return_object();
...
};
struct HelloWorldMessage
{
...
};
auto HelloWorldPromise::get_return_object()
{
return HelloWorldMessage(*this);
}
Далее - прекращение и возврат void можно упростить до:
void return_void() noexcept
{}
void unhandled_exception()
{
std::terminate();
}
Далее - в итераторе - мы будем полагаться на handle.done
- поэтому state.finalWord
не нужен. Полный источник итератора:
struct Iter
{
promise_handle handle = nullptr;
HelloWorldState state;
reference operator * () const { return state.currentWord; }
pointer operator -> () const { return std::addressof(operator*()); }
bool operator == (const Iter& other) { return !handle == !other.handle; }
bool operator != (const Iter& other) { return !(*this == other); }
Iter() = default;
Iter(promise_handle handle)
: handle(handle)
{
next();
}
Iter& operator ++()
{
if (!handle)
return *this;
next();
return *this;
}
void next()
{
if (!handle)
return;
try {
handle.resume();
if (!handle.done())
state = handle.promise().state;
else {
handle = nullptr;
}
} catch (...) {
std::cerr << "@%$#@%#@$% \n";
}
}
};
И полный рабочий пример здесь .
Я беру большинство своих исправлений из этого 2018 / n4736.pdf .