std::future<T>::get
From cppreference.com
| メインテンプレート |
||
| T get(); |
(1) | (C++11以降) |
| std::future<T&> の特殊化 |
||
| T& get(); |
(2) | (C++11以降) |
| std::future<void> の特殊化 |
||
| void get(); |
(3) | (C++11以降) |
get メンバ関数は、共有状態が準備完了になるまで待機し(wait() を呼び出すことによって)、その後、共有状態に格納されている値(もしあれば)を取得します。この関数を呼び出した直後、valid() は false になります。
この関数を呼び出す前に valid() が false の場合、動作は未定義です。
目次 |
[edit] 戻り値
1) 共有状態に格納されている値 v。これは std::move(v) として返されます。
2) 共有状態に値として格納されている参照。
3) (なし)
[edit] 例外
future が参照する共有状態に例外が格納されていた場合(例: std::promise::set_exception() の呼び出しによる)、その例外がスローされます。
[edit] 注記
C++ 標準では、呼び出し前に valid() が false であるケースを検出して、エラー条件 std::future_errc::no_state を持つ std::future_error をスローすることを実装に推奨しています。
[edit] 例
このコードを実行
#include <chrono> #include <future> #include <iostream> #include <string> #include <thread> std::string time() { static auto start = std::chrono::steady_clock::now(); std::chrono::duration<double> d = std::chrono::steady_clock::now() - start; return "[" + std::to_string(d.count()) + "s]"; } int main() { using namespace std::chrono_literals; { std::cout << time() << " launching thread\n"; std::future<int> f = std::async(std::launch::async, [] { std::this_thread::sleep_for(1s); return 7; }); std::cout << time() << " waiting for the future, f.valid() = " << f.valid() << '\n'; int n = f.get(); std::cout << time() << " f.get() returned " << n << ", f.valid() = " << f.valid() << '\n'; } { std::cout << time() << " launching thread\n"; std::future<int> f = std::async(std::launch::async, [] { std::this_thread::sleep_for(1s); return true ? throw std::runtime_error("7") : 7; }); std::cout << time() << " waiting for the future, f.valid() = " << f.valid() << '\n'; try { int n = f.get(); std::cout << time() << " f.get() returned " << n << ", f.valid() = " << f.valid() << '\n'; } catch (const std::exception& e) { std::cout << time() << " caught exception " << e.what() << ", f.valid() = " << f.valid() << '\n'; } } }
実行結果の例
[0.000004s] launching thread [0.000461s] waiting for the future, f.valid() = 1 [1.001156s] f.get() returned with 7, f.valid() = 0 [1.001192s] launching thread [1.001275s] waiting for the future, f.valid() = 1 [2.002356s] caught exception 7, f.valid() = 0
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2096 | C++11 | (1) のオーバーロードは、T が MoveAssignable であるかどうかをチェックするために必要です。 |
要求されない |
[edit] 関連項目
| futureが共有状態を持っているかどうかをチェックします。 (public member function) |