C++ 11 lambda捕获实际捕获了多少?

Jus*_*n G 8 c++ performance lambda c++11

我在多个示例中看到,您可以使用单个字符捕获多个变量,如下所示:

Rect rect;
Point point;

auto someLambda = [&](const SomeType& var)
{
    if (rect.Contains(point))
    {
        var.Something();
    }

    this->MemberFunction();
};
Run Code Online (Sandbox Code Playgroud)

这最终会抓住rectpoint通过引用获得访问权限this,但它实际捕获了多少?它只捕获它需要的变量,还是从字面上捕获当前范围内的所有变量?

我在其他示例中看到,您还可以指定要捕获的各个变量:

Rect rect;
Point point;

auto someLambda = [this, &rect, &point](const SomeType& var)
{
    if (rect.Contains(point))
    {
        var.Something();
    }

    this->MemberFunction();
};
Run Code Online (Sandbox Code Playgroud)

这样或那样做有什么好处吗?我曾与之合作的人曾提到过使用"全部捕获" [&]版本的价格更贵,但我找不到任何文件来支持这一点.我只想确切地知道,所以我不会让代码变得比它需要的更复杂,或者做一些我不应该做的昂贵的事情.

jb3*_*326 7

根据http://en.cppreference.com/w/cpp/language/lambda,捕获列表(方括号中的部分)是:

以逗号分隔的零个或多个捕获列表,可选择以捕获默认值开头.捕获列表可以如下传递[...]:

[a,&b]其中a按值捕获,b通过引用捕获.

[this]按值捕获this指针

[&]通过引用捕获lambda体中使用的所有自动变量

[=]按值捕获lambda正文中使用的所有自动变量

[]什么也没捕捉到

这意味着只捕获lambda体中使用的自动(范围 - 生命周期)变量.

我不明白为什么捕获所有东西[&]比单个捕获更昂贵,但明确列出捕获的一个优点是没有机会捕获你没想到的东西.

另一方面,捕获[=]可能证明是昂贵的,因为它将复制一切.也许这就是你的同事所指的.