std::future<T>:: get
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
|
future::get
|
||||
| State | ||||
|
Haupttemplate
|
||
|
T get
(
)
;
|
(1) | (seit C++11) |
|
std::
future
<
T
&
>
Spezialisierungen
|
||
|
T
&
get
(
)
;
|
(2) | (seit C++11) |
|
std::
future
<
void
>
Spezialisierung
|
||
|
void
get
(
)
;
|
(3) | (seit C++11) |
Die
get
Memberfunktion wartet (durch Aufruf von
wait()
), bis der gemeinsame Zustand bereit ist, und ruft dann den im gemeinsamen Zustand gespeicherten Wert ab (falls vorhanden). Unmittelbar nach dem Aufruf dieser Funktion ist
valid()
false
.
Wenn valid() vor dem Aufruf dieser Funktion false ist, ist das Verhalten undefiniert.
Inhaltsverzeichnis |
Rückgabewert
Ausnahmen
Wenn eine Ausnahme im gemeinsam genutzten Zustand gespeichert wurde, auf den der Future verweist (z.B. durch einen Aufruf von std::promise::set_exception() ), dann wird diese Ausnahme geworfen.
Hinweise
Der C++-Standard empfiehlt Implementierungen, den Fall zu erkennen, wenn valid() vor dem Aufruf false ist und eine Ausnahme vom Typ std::future_error mit einem Fehlerzustand von std::future_errc::no_state zu werfen.
Beispiel
#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'; } } }
Mögliche Ausgabe:
[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
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2096 | C++11 |
Überladung
(1)
musste prüfen, ob
T
MoveAssignable
ist
|
nicht erforderlich |
Siehe auch
|
prüft, ob das Future einen gemeinsamen Zustand besitzt
(öffentliche Elementfunktion) |