13

考虑以下代码

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
}

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

4

2 回答 2

22

只能有一个未来。您不能拥有同一个未来的多个副本。因此,您需要将未来的所有权转移给该函数:

printPromised(std::move(f));
//            ^^^^^^^^^^^^

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

auto sf = std::async(std::launch::async, [](){ return 8; }).share();

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

于 2014-11-28T10:10:33.433 回答
1

这是我在讨论后提出的。

#include <future>

typedef std::shared_future<int> SharedFutureInt;

struct Object 
{
    SharedFutureInt m_promised;
    bool isAssigned;

    Object() : isAssigned(false)
    {

    }

    SharedFutureInt getObjects()
    {
        if (isAssigned)
        {
            return m_promised;
        }

        m_promised = std::async(std::launch::async, [](){ return 8; });
        isAssigned = true;
        return m_promised;
    }
};

int main()
{
    Object obj;
    int a = obj.getObjects().get();
    int b = obj.getObjects().get();
    int c = obj.getObjects().get();

    return 0;
}
于 2014-11-28T11:26:58.590 回答