You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已通过std::async赋值并使用的std::future能否重新赋值?

已使用过的std::future能否重新赋值给新的std::async返回值?

你的代码是完全合法的,不会导致未定义行为,这种用法符合C++标准对std::future的规定。

核心原因

std::future的赋值运算符(operator=)支持将新的std::future实例(比如std::async的返回值)赋值给一个已经被使用过的std::future对象,无论原对象处于就绪、未就绪还是无效状态:

  • 赋值时,原std::future会先释放自身关联的所有资源:如果原对象还关联着未完成的异步任务,会等待任务完成后清理;如果已经完成任务或处于无效状态(比如调用过get()后),则直接清理资源。
  • 随后,原对象会接管新std::future的状态,关联新的异步任务。

针对你代码的具体分析

  1. 初始化f1为关联fib(40)异步任务的std::future。
  2. 调用f1.wait()等待任务完成,此时f1进入就绪状态。
  3. 调用f1.get()获取计算结果,此时f1内部存储的结果会被移动,f1变为无效状态(不再关联任何任务或结果)。
  4. 将std::async(std::launch::async, []{ return fib(43); })的返回值赋值给f1,f1重新关联新的异步任务,状态变为未就绪。
  5. 再次调用f1.get(),等待新任务完成并获取结果,整个流程完全合规。

需要注意的是:std::future的get()成员函数只能调用一次(调用后结果被移动,对象变为无效),但你的代码中两次get()分别对应两个独立的异步任务,因此不存在冲突。

内容的提问来源于stack exchange,提问作者EmbeddedDOOD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:25:32