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

为何C++中std::future被初始化为empty状态?构造函数初始化列表疑问

为什么std::future会变成empty状态?

你的分析完全正确,核心原因是C++的成员初始化优先级和顺序规则:

  • 类成员的初始化顺序由它们在类中的声明顺序决定,和构造函数初始化列表的顺序无关。这里SharedResource里先声明tPromise,再声明tFuture。
  • 构造函数初始化列表里的显式初始化,优先级高于成员变量的类内默认初始化(即你写的= tPromise.get_future())。

带tFuture()的情况:

  1. 先默认初始化tPromise,完成后它处于有效状态。
  2. 接着执行初始化列表里的tFuture(),调用std::future的默认构造函数,直接创建一个empty状态的future对象。
  3. 这一步显式初始化会覆盖类内的= tPromise.get_future(),所以tFuture根本没机会和tPromise关联,最终就是empty状态。

移除tFuture()的情况:

  1. 同样先默认初始化tPromise。
  2. 因为初始化列表里没有显式指定tFuture的初始化方式,所以执行类内的默认初始化:调用tPromise.get_future(),生成一个和当前tPromise绑定的future,状态自然是pending。

简单说就是:你在构造函数里手动调用std::future(),相当于把原本要和promise绑定的future替换成了一个空的默认对象。


附原代码:

struct SharedResource
{
    SharedResource(const SharedResource&) = delete;
    SharedResource& operator=(const SharedResource&) = delete;
    SharedResource() :
        tPromise(), tFuture()
        {}

    std::promise<void> tPromise;
    std::future<void> tFuture = tPromise.get_future();
};

int main()
{
    SharedResource sr;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:15:07