std::future<>::get 清空结果

Mic*_*kis 0 c++ visual-studio visual-studio-2019

我有一个线程函数可以返回外部 IP,并认为我可以将它用于std::future:

std::future<std::string> GetIP4;
GetIP4 = std::async([]() -> std::string
    {
        return GetWanIP();
    });
Run Code Online (Sandbox Code Playgroud)

稍后在我调用的代码中GetIP4.get(),我得到一个std::string. 但是这会清空对象,所以下次我尝试get从另一个线程调用时它会崩溃。

这是预期的行为std::future<>::get()吗?是“我只有一​​次”的场景吗?我在文档中没有找到任何内容。

Fra*_*eux 5

从 cppreference 开始std::future<T>::get:

任何共享状态都被释放。valid()是false在调用此方法之后。

就在之前提到

如果该行为是不确定的valid()是false在调用此函数之前。

既然valid()must betrue调用get()并get()导致valid()变成false,那么不可能多次get()得到相同的future结果。