std::future<T>::get
来自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,那么行为未定义。
返回值
1) 以 std::move(v) 返回在共享状态中存储的值 v。
2) 在共享状态中作为值存储的引用。
3) (无)
异常
如果 future 引用的共享状态中存储了异常(例如,通过调用 std::promise::set_exception()),那么就会抛出该异常。
注解
C++ 标准建议实现在调用前检测 valid() 是 false 的情况,并抛出以 std::future_errc::no_state 作为错误条件的 std::future_error。
示例
运行此代码
#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() << " 启动线程\n"; std::future<int> f = std::async(std::launch::async, [] { std::this_thread::sleep_for(1s); return 7; }); std::cout << time() << " 等待 future,f.valid() = " << f.valid() << '\n'; int n = f.get(); std::cout << time() << " future.get() 返回 " << n << ",f.valid() = " << f.valid() << '\n'; } { std::cout << time() << " 启动线程\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() << " 等待 future,f.valid() = " << f.valid() << '\n'; try { int n = f.get(); std::cout << time() << " future.get() 返回 " << n << ",f.valid() = " << f.valid() << '\n'; } catch (const std::exception& e) { std::cout << time() << " 捕获到异常 " << e.what() << ",f.valid() = " << f.valid() << '\n'; } } }
可能的输出:
[0.000004s] 启动线程 [0.000461s] 等待 future,f.valid() = 1 [1.001156s] future.get() 返回 7,f.valid() = 0 [1.001192s] 启动线程 [1.001275s] 等待 future,f.valid() = 1 [2.002356s] 捕获到异常 7,f.valid() = 0
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2096 | C++11 | 重载 (1) 需要检查 T 是否可移动赋值 (MoveAssignable)
|
不需要 |
参阅
检查未来体是否拥有共享状态 (公开成员函数) |