std::promiseがno_stateでエラーになる状況

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