std::future<T>::get
| Основной шаблон | ||
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, поведение не определено.
Возвращаемое значение
v, хранящееся в общем состоянии, в виде std::move(v).Исключения
Если исключение было сохранено в общем состоянии, на которое ссылается future (например, посредством вызова std::promise::set_exception()), то это исключение будет выброшено.
Примечания
Стандарт C++ рекомендует реализациям обнаруживать случай, когда valid() до вызова является false, и выбрасывать std::future_error с условием ошибки std::future_errc::no_state.
Пример
#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
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Поведение в опубликованной версии | Правильное поведение |
|---|---|---|---|
| LWG 2096 | C++11 | перегрузка (1) должна была проверять, является ли T MoveAssignable | не требуется |
См. также
| проверяет, имеет ли future общее состояние (функция-член открытого доступа) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/future/get