谁拥有 future 和 promise 中的共享状态?特别是谁负责这些类中共享状态的构造和删除?还是应该对共享状态进行引用计数?我无法通过阅读有关cppreference的文档来获得答案。

我想到的最简单的方法是让std::promise类负责创建共享状态,但随后将其交给从std::future提取的std::promise,以便在 future 被破坏时删除。 。但是,此方法可能导致悬空 promise 对象。因此,我不确定两者之间应该真正共享状态。

例如,下面的代码是否会产生未定义的行为(因为在破坏 future 时可能会破坏共享状态)?

auto prom = std::promise<void>{};
{
    auto fut = prom.get_future();
}
prom.set_value();

此外,有关cppreference的std::promise::~promise的文档说“如果共享状态就绪,则将其释放”,这使我认为共享状态未计算引用。

最佳答案

std::future(或std::promise)被销毁时,它将释放其共享状态。

This rule声明当说异步返回对象或异步提供程序释放其共享状态时,它将放弃对共享状态的引用。

如果该引用是最后一个引用,则共享状态将被破坏。

因此,是的,共享状态似乎是引用计数,并且不,您的代码示例不会产生UB,因为prom仍然持有对该共享状态的引用。

10-08 11:04