std::future<T>:: get
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
|
future::get
|
||||
| State | ||||
|
Modèle principal
|
||
|
T get
(
)
;
|
(1) | (depuis C++11) |
|
std::
future
<
T
&
>
spécialisations
|
||
|
T
&
get
(
)
;
|
(2) | (depuis C++11) |
|
std::
future
<
void
>
spécialisation
|
||
|
void
get
(
)
;
|
(3) | (depuis C++11) |
La fonction membre
get
attend (en appelant
wait()
) jusqu'à ce que l'état partagé soit prêt, puis récupère la valeur stockée dans l'état partagé (le cas échéant). Immédiatement après l'appel de cette fonction,
valid()
est
false
.
Si valid() est false avant l'appel à cette fonction, le comportement est indéfini.
Table des matières |
Valeur de retour
Exceptions
Si une exception a été stockée dans l'état partagé référencé par le futur (par exemple via un appel à std::promise::set_exception() ) alors cette exception sera levée.
Notes
La norme C++ recommande aux implémentations de détecter le cas où valid() est false avant l'appel et de lever une std::future_error avec une condition d'erreur de std::future_errc::no_state .
Exemple
#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() << " lancement du thread\n"; std::future<int> f = std::async(std::launch::async, [] { std::this_thread::sleep_for(1s); return 7; }); std::cout << time() << " attente du future, f.valid() = " << f.valid() << '\n'; int n = f.get(); std::cout << time() << " f.get() a retourné " << n << ", f.valid() = " << f.valid() << '\n'; } { std::cout << time() << " lancement du 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() << " attente du future, f.valid() = " << f.valid() << '\n'; try { int n = f.get(); std::cout << time() << " f.get() a retourné " << n << ", f.valid() = " << f.valid() << '\n'; } catch (const std::exception& e) { std::cout << time() << " exception attrapée " << e.what() << ", f.valid() = " << f.valid() << '\n'; } } }
Sortie possible :
[0.000004s] lancement du thread [0.000461s] attente du future, f.valid() = 1 [1.001156s] f.get() a retourné 7, f.valid() = 0 [1.001192s] lancement du thread [1.001275s] attente du future, f.valid() = 1 [2.002356s] exception attrapée 7, f.valid() = 0
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2096 | C++11 |
la surcharge
(1)
devait vérifier si
T
est
MoveAssignable
|
non requis |
Voir aussi
|
vérifie si le futur a un état partagé
(fonction membre publique) |