假设我有一个返回的函数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
按值返回的函数始终是错误的。事实上,给出任何不只是命名(成员)变量的参数std::move
几乎总是错误的。用于构造的构造函数调用
actual_vector
完全取决于 的实现get
。但是,标准要求 的值是通过调用 生成的,std::move(v)
其中v
是共享状态,因此如果可能的话将使用移动构造。std::future::get
std::future
还指定释放共享状态,即,如果是最后一个引用共享状态的对象,则必须销毁共享状态下的对象。