==
сравнивает ссылки на объекты в Java и не является исключением для объектов String
.
Для сравнения фактического содержимого объектов (в том числе String
) необходимо использовать equals
.
Если сравнение двух объектов String
с использованием ==
оказывается true
, это связано с тем, что объекты String
были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String
. Не следует ожидать сравнения одного объекта String
, содержащего то же содержимое, что и другой объект String
, используя ==
для оценки как true
.
Как вы упомянули сами, проблема в том, что future
отошел от вызова .then()
. Хитрость заключается в том, чтобы переместить его обратно, когда он будет готов. Это может быть сделано, если продолжение, переданное в .then()
, принимает future
, а не значение, которое оно содержит.
Вот функции, которые я взял из вашего кода и изменил. Я также изменил их с передачи вещей в std::async
в качестве параметров, чтобы просто захватывать их, поскольку это выглядит более интуитивно для меня, но это не является важным изменением здесь.
template <typename Work>
auto then(Work&& w) -> co_future<decltype(w())> {
return { std::async([fut = std::move(*this), w = std::forward<Work>(w)]() mutable {
fut.wait();
return w();
})};
}
template <typename Work>
auto then(Work&& w) -> co_future<decltype(w(std::move(*this)))> {
return { std::async([fut = std::move(*this), w = std::forward<Work>(w)]() mutable {
return w(std::move(fut));
})};
}
void await_suspend(std::experimental::coroutine_handle<> ch) {
then([ch, this](auto fut) mutable {
*this = std::move(fut);
ch.resume();
});
}
Кстати, VS2017 жалуется на наличие set_exception()
и unhandled_exception()
в типе обещания. Я удалил set_exception()
и изменил unhandled_exception()
на это:
void unhandled_exception() {
_promise.set_exception(std::current_exception());
}