为什么[=]可以用来修改lambda中的成员变量?

时间:2017-03-19 01:13:38

标签: c++ c++11 lambda c++14

http://coliru.stacked-crooked.com/a/29520ad225ced72d

#include <iostream>

struct S
{
    void f()
    {
        //auto f0 = []     { ++i; }; // error: 'this' was not captured for this lambda function

        auto f1 = [this] { ++i; };    
        auto f2 = [&]    { ++i; };
        auto f3 = [=]    { ++i; };
        f1();
        f2();
        f3();
    }

  int i = 10;  
};

int main()
{
    S s;
    std::cout << "Before " << s.i << std::endl;
    s.f();
    std::cout << "After " << s.i << std::endl;
}

Before 10
After 13

问题:为什么[=]能够修改lambda中的成员变量?

3 个答案:

答案 0 :(得分:19)

  

问题&GT;为什么[=]能够修改lambda中的成员变量?

因为(参见cpp reference[=]“捕获lambda正文中使用的所有自动变量,如果存在则通过引用捕获当前对象”

所以[=]通过引用捕获当前对象,并且可以修改i(它是当前对象的成员)。

答案 1 :(得分:9)

如果以相同的方式书写,这种行为将更加明确:

auto f3 = [=]    { ++(this->i); };

你没有抓住i而是this,它会保持不变,但是其指向的东西可以像任何其他指针那样被编辑。

答案 2 :(得分:6)

您可以设想[=]按值捕获this,然后使用复制的this访问this->i

复制的this仍允许您访问对象this点。