为什么不在C++;14使用[&;将我移动到\u lambda]语法?

为什么不在C++;14使用[&;将我移动到\u lambda]语法?,lambda,c++14,Lambda,C++14,我喜欢新的C++14增加了lambdas捕获仅移动参数的能力,但我不喜欢语法: 什么原因更简单 auto f = [&&x]{return x->twenty_perc_cooler();}; 没有使用?这一问题实际上在关于移动捕获的提案中得到了解决: 为什么不使用&&&捕获 经常有人问我们为什么不支持这样的东西 [&&x]{…} 这里的问题是,我们不是通过右值引用捕获,而是 正在尝试移动。如果我们通过右值引用捕获 移动将发生得太晚,因为它是在捕获时发生的 时间,而不是

我喜欢新的C++14增加了lambdas捕获仅移动参数的能力,但我不喜欢语法:

什么原因更简单

auto f = [&&x]{return x->twenty_perc_cooler();};

没有使用?

这一问题实际上在关于移动捕获的提案中得到了解决:

为什么不使用&&&捕获

经常有人问我们为什么不支持这样的东西

[&&x]{…}

这里的问题是,我们不是通过右值引用捕获,而是 正在尝试移动。如果我们通过右值引用捕获 移动将发生得太晚,因为它是在捕获时发生的 时间,而不是通话时间。只要我们能捕捉到 有个名字,我们不应该隐藏它


我认为这将是令人惊讶的,并且与右值引用的设计相矛盾。右值引用的要点是记录该值并没有别名,并且通过
std::move
明确传递唯一引用持有者。你的建议会使无别名保证难以遵循,而且很脆弱。而且,这有什么意义?
[&x](){}
[&&x](){}
之间有什么区别?在这两种情况下,
x
必须引用一个现有的命名值。在第一种情况下,如果x是向量x不是空的,那么在第二种情况下,它是空的。为什么?你只是绑定了一个引用,没有改变任何状态?为了清楚我想要这个:std::vector vi{1,2,3,47};自动f=[&&vi](){};断言(0==v.size());对于unique_ptr和其他用户定义的类型也是一样的……我不同意这个决定,但是很好的发现,接受了