Почему [=] можно использовать для изменения переменных-членов в лямбда?

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

Вопрос: Почему [=] разрешает модификацию переменных-членов в лямбда?

Ответы

Ответ 1

Вопроs > Почему [=] позволяет изменять переменные-члены в лямбда?

Потому что (см. ссылка cpp) [=] "фиксирует все автоматические переменные odr, используемые в теле лямбда по значению и текущему объекту по ссылке, если существует"

Итак [=] захватить текущий объект по ссылке и может изменить i (который является членом текущего объекта).

Ответ 2

Если вы напишете эквивалентным образом, это будет более понятно:

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

Вы не поймаете i, но this, он будет постоянным, но то, что его точки будут доступны для редактирования, как и в любом другом указателе.

Ответ 3

Вы можете себе представить, что [=] захватить this по значению, а затем скопировать this для доступа к this->i.

скопированный this по-прежнему позволяет вам получить доступ к объектам this точек в.