名前空間
変種
操作

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

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

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

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

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

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

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

[編集]

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