为什么lambda中的变量捕获如此复杂?

Kil*_*nDS 3 c++ c++11

我想知道新的C++ 11 lambda功能,在我的拙见中是一个很好的补充,但我真的没有得到整个变量捕获部分.简而言之,我的问题归结为"为什么委员会决定这一点并且不仅仅使用[&]功能(可能还有关键字)?"

起初我想'哇,C++再来一次,给我们更强大的羔羊,尽管语法很难过'.然而,然后我试着想到这个复杂的lambdas真实有用的案例,我想不出任何.

首先,如果你想混合pass-by-reference和pass-by-value,你显然需要它.那么问题是,我们实际上是否需要lambda结构中的pass-by-value.在lambda体内创建临时文件有什么问题.如果你想要一个循环体中的上部范围变量的副本,这是类似的,我们也不写[x] while(...) { ... }.我在这里遗漏了一些东西,这使得通过价值真的很有必要,你不能再自己构建一个副本了吗?

所以我们来到第二部分,假设没有必要使用pass-by-value,使用当前语法可以指定要捕获哪些变量,哪些不是.我再一次看不到这个好处.lambda是在本地范围内编写的,与变量相同.为什么需要限制对这些变量的访问?它不是一个接口,不是另一个上下文,它甚至不应该是另一个程序员.它也不会为编译器优化它,因为[&]自己使用或提及每个使用过的变量应归结为相同的代码.

现在,我确实知道我并没有完全掌握C++,委员会的人比我更了解.所以,我的哪些论点是错误的(或者我错过了什么)以及为什么他们不仅仅决定使用这些[&]功能,最好是使用关键字而不是当前(相当丑陋)的语法.

spr*_*aff 7

您需要按参考提高效率.

您需要by-value来允许函数对象离开它捕获的局部变量的范围.

std::function<void()> get_foo (const std::string & bar)
{
    return [=] () {something with bar;}
}
Run Code Online (Sandbox Code Playgroud)