假设我有一个返回
std::vector
的函数,我想异步调用它。
std::vector<int> foo(int n);
int main() {
auto future_vector = std::async(foo, 999);
// ... other stuff
// Questions are all about this:
auto actual_vector = future_vector.get();
// ... do stuff with actual_vector ...
}
Q1:
actual_vector
是从共享状态复制构造还是移动构造的? 我需要明确写std::move(future_vector.get())
吗?
Q2:假设函数完成并且不再持有承诺:共享状态的生命周期是在未来调用
get
时结束还是持续到未来达到其生命周期结束?
std::future::get
按值返回。在按值返回的函数上调用 move
始终是错误的。
用于构造
actual_vector
的构造函数调用完全取决于get
的实现。然而,该标准要求该值是通过调用 std::move(v)
生成的,其中 v
是共享状态,因此如果可能,将使用移动构造。