了解用于C ++ 11的Lambda中的移动捕获

时间:2015-06-04 15:50:14

标签: c++ c++11 lambda move rvalue-reference

我有一个关于为解决C ++ 11 lambdas中的移动捕获而提出的解决方法的问题。特别是,以Meyer's book

为例
std::vector<double> data;
... 
auto func = std::bind( [](const std::vector<double>& data) 
                       { /*uses of data*/ },
                       std::move(data)
                     );

我的问题是:声明参数&#34;数据&#34;的后果/意义是什么?作为右值参考?:

auto func = std::bind( [](std::vector<double>&& data)
...

为了帮助您指导答案,我将提出三项索赔。请告诉我,我是对还是错:

  • 在这两种情况下,C ++ 14中包含的移动捕获语义都可以很好地模拟。
  • 在这两种情况下,在定义&#34; func&#34;之后使用数据是不安全的。
  • 不同之处在于,在第二种情况(rvalue reference)中,我们声明可调用对象(lambda)可以移动&#34; data&#34;的内容。

提前致谢。

1 个答案:

答案 0 :(得分:6)

  

声明参数的后果/意义是什么?   &#34; data&#34;作为右值参考?

它不会编译(至少如果你试图实际调用func)。 std::bind总是将绑定参数作为左值传递,它不会绑定到右值参考。

  

在这两种情况下,在定义&#34; func&#34;之后使用数据是不安全的。

移动时

data处于有效但未指定的状态。您可以像使用内容未知的矢量一样使用它。