Namespaces
Variants

std::experimental::future<T>:: then

From ja.cppreference.net

template < class F >
future < /* see below */ > then ( F && func ) ;

継続 func * this にアタッチします。 * this が共有状態に関連付けられていない場合(すなわち、 valid ( ) == false の場合)、動作は未定義です。

返されるfutureオブジェクトに関連付けられた共有状態を作成し、thenを呼び出すスレッドで評価される DECAY_COPY ( std:: forward < F > ( func ) ) によって構築されたかのような func のコピー fd を作成します。ここで DECAY_COPY は以下のように定義されます。

template<class T>
std::decay_t<T> DECAY_COPY(T&& v)
{
    return std::forward<T>(v);
}

現在このオブジェクトに関連付けられている共有状態が準備完了となったとき、 継続 INVOKE ( std :: move ( fd ) , std :: move ( * this ) ) が未規定の実行スレッド上で呼び出される。ここで INVOKE Callable で定義された操作である。その式が無効な場合、動作は未定義となる。

継続から返される値は、返された future オブジェクトの共有状態に結果として格納されます。継続の実行から伝播された例外は、返された future オブジェクトの共有状態に例外的結果として格納されます。

Uを継続の戻り値型(すなわち std:: result_of_t < std:: decay_t < F > ( std:: experimental :: future < T > ) > )とする。Uがある型T2に対する std:: experimental :: future < T2 > である場合、thenの戻り値型は std:: experimental :: future < T2 > となり、それ以外の場合は std:: experimental :: future < U > となる。これは 暗黙的なアンラップ として知られる。

暗黙的なアンラップが発生し、継続が無効なfutureを返した場合、共有状態はstd::future_error型の例外で準備完了状態となり、エラー条件はstd::future_errc::broken_promiseとなります。

この関数が戻った後、 valid ( ) false になります。

パラメータ

func - アタッチされる継続

戻り値

このオブジェクトによって作成された共有状態に関連付けられた std::experimental::future オブジェクト。 返されるオブジェクトに対して valid ( ) == true が成り立ちます。