std::promiseクラスのget_future()メンバ関数は、2つの理由でstd::future_error例外を投げる可能性があります。
ひとつは、get_future()が2回以上呼ばれた場合。この場合は、std::future_errc列挙型のfuture_already_retrieved値をエラー値としてstd::future_errorが投げられます。
もうひとつは、promiseが共有状態を持っていない場合。この場合にno_stateをエラー値としてstd::future_errorが投げられます。
2つめの条件で、promiseが共有状態を持ってないというのはどういうことなのか。これは、以下のような状況で起きます。
#include <iostream> #include <future> #include <thread> #include <utility> void foo(std::promise<int> p) { p.set_value(1); } int main() { std::promise<int> p; std::promise<int> p2 = std::move(p); std::future<int> f = p2.get_future(); std::thread t(foo, std::move(p2)); f.get(); try { p.get_future(); } catch (std::future_error& e) { std::cout << e.what() << std::endl; } t.join(); }
No associated state
つまり、ムーブされたpromiseに対してget_future()を呼び出すと、共有状態なし(no_state)と見なされます。
参照:
promise::get_future() - cpprefjp