2016-03-23 4 views
5

Rozważmy następujący przykład: minimalny,Przechwytywanie Lambda: używać inicjatora lub nie używać?

int main() { 
    int x = 10;  
    auto f1 = [x](){ }; 
    auto f2 = [x = x](){}; 
} 

widziałem więcej niż jeden raz takiego wykorzystania inicjatora [x = x], ale nie może w pełni zrozumieć i dlaczego warto go używać zamiast [x].
mogę sens coś jak [&x = x] lub [x = x + 1] (jak pokazano w documentation i dlaczego różnią się one od [x], oczywiście, ale nadal nie mogę dowiedzieć się różnice między lambdas w przykładzie.

są one w pełni wymienialne, czy jest jakaś różnica nie widzę

+2

to ma znaczenie, jeśli oryginalny ' x' to 'const'. –

+0

Czy przechwytuje go przez kopiowanie w obu przypadkach? – skypjack

+0

@skypjack: W przypadku '[x = ...]', 'x' może być skopiowane lub zainicjalizowane - zależy od wyrażenia po prawej stronie. Dla '[x = x]' konkretnie, to jest inicjalizacja kopii, tak. – ildjarn

Odpowiedz

8

istnieją różne przypadki narożne, że dość dużo sprowadza? „[x = x] rozpada; [x] nie”.

  • przechwytywanie odniesienie funkcjonować:

    void (&f)() = /* ...*/; 
    [f]{};  // the lambda stores a reference to function. 
    [f = f]{}; // the lambda stores a function pointer 
    
  • przechwytywanie tablicy:

    int a[2]={}; 
    [a]{}  // the lambda stores an array of two ints, copied from 'a' 
    [a = a]{} // the lambda stores an int* 
    
  • przechwytywanie cv wykwalifikowany rzecz:

    const int i = 0; 
    [i]() mutable { i = 1; } // error; the data member is of type const int 
    [i = i]() mutable { i = 1; } // OK; the data member's type is int 
    
+0

Tak, to tak, jak powiedziałeś w komentarzu - * Ważne, jeśli oryginalne 'x' jest' const' *. Inne sprawy wydają się nie być interesujące. Dziękuję Ci. – skypjack