为何C++中std::future被初始化为empty状态?构造函数初始化列表疑问
为什么std::future会变成empty状态?
你的分析完全正确,核心原因是C++的成员初始化优先级和顺序规则:
- 类成员的初始化顺序由它们在类中的声明顺序决定,和构造函数初始化列表的顺序无关。这里
SharedResource里先声明tPromise,再声明tFuture。 - 构造函数初始化列表里的显式初始化,优先级高于成员变量的类内默认初始化(即你写的
= tPromise.get_future())。
带tFuture()的情况:
- 先默认初始化
tPromise,完成后它处于有效状态。 - 接着执行初始化列表里的
tFuture(),调用std::future的默认构造函数,直接创建一个empty状态的future对象。 - 这一步显式初始化会覆盖类内的
= tPromise.get_future(),所以tFuture根本没机会和tPromise关联,最终就是empty状态。
移除tFuture()的情况:
- 同样先默认初始化
tPromise。 - 因为初始化列表里没有显式指定
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
相关产品推荐
相关产品推荐

