std::experimental::shared_future<T>::then
| template< class F > future</* 以下参照 */> then( F&& func ) const; |
||
継続 func を *this にアタッチします。 *this が関連付けられた共有状態を持たない場合(つまり、 valid() == false の場合)は、未定義の動作となります。
返される future オブジェクトに関連付けられる共有状態と、 func のコピー fd を作成します。これは、 DECAY_COPY( std::forward<F>(func) ) で構築されるものとして評価されます。ここで、 DECAY_COPY は then を呼び出すスレッドで評価されます。
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 となります。
[編集] 例
| このセクションは未完成です 理由: 例がありません |