C++ 了解Lambdas for C++;11

C++ 了解Lambdas for C++;11,c++,c++11,lambda,move,rvalue-reference,C++,C++11,Lambda,Move,Rvalue Reference,为了解决C++11 lambdas中的移动捕获问题,我提出了一个关于解决方案的问题。特别是,以以下方面为例: std::矢量数据; ... auto func=std::bind([](常量std::向量和数据) {/*数据的使用*/}, 标准::移动(数据) ); 我的问题是:将参数“data”声明为右值引用的后果/意义是什么 auto func = std::bind( [](std::vector<double>&& data) ... auto-func

为了解决C++11 lambdas中的移动捕获问题,我提出了一个关于解决方案的问题。特别是,以以下方面为例:

std::矢量数据;
... 
auto func=std::bind([](常量std::向量和数据)
{/*数据的使用*/},
标准::移动(数据)
);
我的问题是:将参数“data”声明为右值引用的后果/意义是什么

auto func = std::bind( [](std::vector<double>&& data)
...
auto-func=std::bind([](std::vector&&data)
...
为了帮助你找到答案,我将提出三点主张。请告诉我我是对还是错:

  • 在这两种情况下,都很好地模拟了C++14中包含的移动捕获语义
  • 在这两种情况下,在“func”定义之后使用数据是不安全的
  • 区别在于,在第二种情况下(右值引用),我们声明可调用对象(lambda)可以移动“数据”的内容
提前谢谢

声明参数的后果/意义是什么 “
数据
”作为右值引用

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

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


数据
被移动保留在有效但未指定的状态。您可以像使用内容未知的向量一样使用它。

如果仍然传递
std::move(数据),结果是它将无法编译
bind
,然后
bind
将移动构造一个内部
std::vector
,并将尝试传递它(非临时!)对于使用右值引用的lambda,总是在@T.C.上击败我!但是,非常量左值引用是有效的,可以用作移动构造或移动赋值的源。当然,在随后调用lambda时,旧内容很可能会消失(对于任何主要的实现,全然可能意味着100%的概率,因为它们都将源向量保留为空)。我假设std::bind的参数有一个重载版本,带有右值引用。我应该在询问之前尝试编译。我真傻!感谢所有的澄清。
auto func = std::bind( [](std::vector<double>&& data)
...