c++ - move 语义和 std::future

标签 c++ c++11 future move-semantics

我自己研究了 C++11 特性并识别了 move 语义,并尝试将它至少应用于处理容器或“更大”对象的每个函数。现在我发现了一些我想并行运行的任务,所以我会使用 std::future,但这些任务处理容器(在我的情况下返回一个容器)。 所以我有这个伪代码:

std::future<container&&> c = std::async([]()->container&&{ /* stuff return a local container object */ });

我问自己容器 rval ref 的生命周期是如何控制的?如果我是对的并且任务在我调用 c.get() 之前完成,它就会被存储。存储的值是否仍包含可用对象?

这能确保它的生命周期吗?

std::future<container> c = std::async([]()->container&&{ /* same stuff -- ^ -- */ });
container cc = std::move(c.get());

最佳答案

看起来你的 move 语义是错误的。

您应该按值而不是右值引用返回,并让 move 构造函数确保按值返回是高效的。否则,您可能会返回对不再存在的对象的悬空引用。 move 语义的要点是让按值传递对象变得便宜,右值引用只是实现这一点的语言特性,目标不应该是为了自己的利益而使用右值引用。

换句话说,您想将数据从 lambda 主体 move 到 lambda 的返回值,再到 future 的存储值。这 move 数据。你不想传递一个引用,它不会 move 任何东西(你已经可以在 C++03 中使用左值引用通过引用传递东西!)

你的 lambda 应该按值返回,future 应该按值存储:

std::future<container> c = std::async([]()->container{ /* stuff */ });

而且您不需要使用 std::move,unique futures 将存储的值作为右值返回,因此您可以自动从它 move 而无需使用 std::move 将其转换为右值:

container cc = c.get();   // cc will be move constructed

关于c++ - move 语义和 std::future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25762940/

相关文章:

c++ - 我必须在我的应用程序中包含所有这些 Qt dll 吗?

C++ std::function 返回它自己类型的 vector (再次递归类型)

flutter - Dart 中的批处理 future

c++ - 使用 std::bind 调用 std::string 方法

scala - 使用 ScalaTest 和 Future 进行集成测试

c++ - 使用 std::future/std::async

c++ - 无法在 NetBeans : "No Shell Found" error 中运行 C++

c++ - 函数的执行时间在运行时减少。 (C++) 为什么?

c++ - Boost:触发并忘记异步函数调用?

c++ - 如何在 makefile 中设置编译标志?