考虑以下代码
void printPromised(std::futuref) { std::cout << f.get() << std::endl; } int main() { printPromised(std::async(std::launch::async, [](){ return 8; })); // This works auto f = std::async(std::launch::async, [](){ return 8; }); printPromised(f); // This won't work }
它说"这是一个删除的功能".这是为什么?此外,我需要传递(共享)std::async
生成的相同承诺结果; 给多个用户.这意味着当有人调用"getter"时,我需要传递相同的结果(std::async
如果已经生成了,我不需要重新生成结果)并且我还需要具有的阻塞机制std::future::get
.
只有一个未来.你不能拥有同一个未来的多个副本.因此,您需要将未来的所有权转移到该功能:
printPromised(std::move(f)); // ^^^^^^^^^^^^
如果你真的需要共享访问未来,你可以shared_future
通过调用share()
成员函数来构建一个普通的未来; 这与共享指针的行为类似:
auto sf = std::async(std::launch::async, [](){ return 8; }).share();
现在sf
可以复制,并且所有副本都等待相同的结果,即wait()
所有副本上的调用可能会阻塞,并将与结果的准备就绪同步.