Namespaces
Variants

std::experimental::shared_future<T>:: then

From cppreference.net

template < class F >
future < /* 下記参照 */ > then ( F && func ) const ;

継続 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);
}

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

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

U を継続の戻り値型(すなわち std:: result_of_t < std:: decay_t < F > ( const std:: experimental :: shared_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 ( ) true になります。

パラメータ

func - アタッチされる継続

戻り値

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