Почему [=] можно использовать для изменения переменных-членов в лямбда?
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
точек в.