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

Fra*_*Moy 3 c++ lambda move rvalue-reference c++11

我有一个关于为解决C++ 11 lambdas中的移动捕获而提出的解决方法的问题.特别是以迈耶的书为例:

std::vector<double> data;
... 
auto func = std::bind( [](const std::vector<double>& data) 
                       { /*uses of data*/ },
                       std::move(data)
                     );
Run Code Online (Sandbox Code Playgroud)

我的问题是:将参数"data"声明为右值参考会产生什么后果/意义?:

auto func = std::bind( [](std::vector<double>&& data)
...
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

T.C*_*.C. 6

将参数" data" 声明为右值参考会产生什么后果/意义?

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

在这两种情况下,在定义"func"之后使用数据是不安全的.

data移动使其处于有效但未指定的状态.您可以像使用内容未知的向量一样使用它.

  • 但是,非常量左值参考可以起作用,并且可以用作移动构造或移动分配的源.当然,在随后的lambda调用中,旧的内容很可能会消失(所有可能意味着任何主要实现的确实100%概率,因为它们都将源向量留空). (2认同)