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

时间:2011-09-19 11:37:22

标签: 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 ++,委员会中的人比我更了解。那么,我的哪些论点是错误的(或者我错过了什么)以及为什么他们不仅仅决定使用[&]功能,最好使用关键字而不是当前(非常丑陋)语法。

2 个答案:

答案 0 :(得分:7)

您需要按参考提高效率。

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

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

答案 1 :(得分:2)

...而针对新关键字的决定主要是因为向后兼容性。如果您引入新关键字,则可能会破坏使用该关键字作为常规标识符的现有代码。

即使您只破坏了现有代码的0.01%,如果可以阻止,也不希望为此类更改创建成本。