2017-03-19 12 views
15

http://coliru.stacked-crooked.com/a/29520ad225ced72dDlaczego można [=] używać do modyfikowania zmiennych składowych w lambda?

#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 

Pytanie: Dlaczego [=] umożliwiają modyfikację zmiennych składowych w lambda?

Odpowiedz

18

Pytanie> Dlaczego [=] umożliwia modyfikację zmiennych składowych w lambda?

Bo (patrz cpp reference) [=] „rejestruje wszystkie zmienne automatyczne odr użyty w korpusie lambda pod względem wartości i bieżącego obiektu poprzez odniesienie jeśli istnieje”

Więc [=] przechwytywania obecny obiekt poprzez odniesienie i może zmodyfikuj i (jest to element bieżącego obiektu).

+1

co oznacza "odr-used"? – q0987

+1

@ q0987 http://stackoverflow.com/questions/19630570/what-does-it-mean-to-odr-use-something – user2176127

+13

Pomyśl o tym jako o przechwytywaniu "tego" przez wartość. – Yakk

7

Jeśli piszesz w równoważny sposób, to zachowanie będzie bardziej jasne:

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

Nie złapać i ale this, to będzie stała, ale rzeczą, że punkty będzie można edytować, jak w żadnym innym wskaźnikiem .

+0

'jak w każdym innym wskaźniku' no, nie każdy wskaźnik do '' constst': P –

5

Można sobie wyobrazić, że [=] przechwytywania this przez wartość, a następnie za pomocą skopiowanego this dostęp do this->i.

skopiowany this nadal pozwala na dostęp do obiektu this punktów na.

Powiązane problemy