名前空間
変種
操作

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

From cppreference.com
< cpp‎ | experimental‎ | future
 
 
 
 
 
template< class F >
future</* 以下参照 */> then( F&& func ) ;

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

返される future オブジェクトに関連付けられた共有状態と、 func のコピー fd を、 DECAY_COPY(std::forward<F>(func)) によって構築されるように作成します。これは、 DECAY_COPY が次のように定義されていると評価されます。

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

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

継続から返された値は、返される 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 です。

[編集]

English 日本語 中文(简体) 中文(繁體)