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) 存储在共享状态中的值 v,作为 std::move(v)。
2) 作为共享状态中的值存储的引用。
3) (无)
[编辑] 异常
如果在期货引用的共享状态中存储了异常(例如,通过调用 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++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 2096 | C++11 | 重载 (1) 需要检查 T 是否 MoveAssignable |
不需要 |
[编辑] 另请参阅
检查期货是否有共享状态 (公共成员函数) |