std::experimental::future<T>::then
| 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)) という継続が、指定されていない実行スレッド上で呼び出されます。ここで、 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 です。
[編集] 例
| このセクションは未完成です 理由: 例がありません |