std :: future作为函数C++的参数

Ami*_*aka 12 c++ c++11 stdasync

考虑以下代码

void printPromised(std::future<int> f)
{
    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
}
Run Code Online (Sandbox Code Playgroud)

它说"这是一个删除的功能".这是为什么?此外,我需要传递(共享)std::async生成的相同承诺结果; 给多个用户.这意味着当有人调用"getter"时,我需要传递相同的结果(std::async如果已经生成了,我不需要重新生成结果)并且我还需要具有的阻塞机制std::future::get.

Ker*_* SB 19

只有一个未来.你不能拥有同一个未来的多个副本.因此,您需要将未来的所有权转移到该功能:

printPromised(std::move(f));
//            ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

如果你真的需要共享访问未来,你可以shared_future通过调用share()成员函数来构建一个普通的未来; 这与共享指针的行为类似:

auto sf = std::async(std::launch::async, [](){ return 8; }).share();
Run Code Online (Sandbox Code Playgroud)

现在sf可以复制,并且所有副本都等待相同的结果,即wait()所有副本上的调用可能会阻塞,并将与结果的准备就绪同步.

  • @AmithChinthaka:对; 这就是`shared_future`的用途. (5认同)
  • @KerrekSB,在我的实现中,`shared_future`没有增加成本,我认为这是相当典型的.共享状态已经必须由至少两个对象(异步提供程序和异步结果)共享,所以我总是用`shared_ptr`管理它,转到N = 2到N> = 2不需要任何费用. (4认同)