2016-01-13 11 views
75

Chcę wiedzieć, co robi [=]? Oto krótki przykładC++ - co robi [=]?

template <typename T> 
std::function<T (T)> makeConverter(T factor, T offset) { 
    return [=] (T input) -> T { return (offset + input) * factor; }; 
} 

auto milesToKm = makeConverter(1.60936, 0.0); 

Jak praca kod z [] zamiast [=]?

std::function<T (T)> 

oznacza prototyp funkcji, która pobiera jako argument i (T) powrotnej typu T?

+0

To jest dziwacznie wysoce głosowane za coś, co wydaje się zadawać 3 różne niezarejestrowane pytania i jest duplikatem [Co to jest wyrażenie lambda w C++ 11?] (Https://stackoverflow.com/questions/7627098/what -is-a-lambda-expression-in-c11) –

Odpowiedz

96

Wymienione [=] jest częściąprzechwytywania dla wyrażenia lambda. To mówi C++, że kod wewnątrz wyrażenia lambda jest inicjowany, tak że lambda otrzymuje kopię wszystkich zmiennych lokalnych, których używa, gdy jest tworzona. Jest to konieczne, aby wyrażenie lambda mogło odnosić się do factor i offset, które są lokalnymi zmiennymi wewnątrz funkcji.

Jeśli zastąpić [=] z [], otrzymasz błąd kompilatora, ponieważ kod wewnątrz wyrażenia lambda nie będzie wiedział, co zmienne offset i factor dotyczą. Wiele kompilatorów daje dobre komunikaty o błędach diagnostycznych, jeśli to zrobisz, więc spróbuj i zobacz, co się stanie!

+12

"Jest to konieczne" - ta dokładna opcja nie jest konieczna; moglibyśmy również napisać '[&]', '[= offset, = input]', itp. –

+1

@ M.M - Czy nie przechwytuje to odniesień do locals? – Useless

+5

@ M.M. Użycie referencyjnego przechwytywania tutaj byłoby problemem, ponieważ okresy tych zmiennych lokalnych zakończyłyby się, gdy tylko zwrócona zostanie wartość lambda. Masz rację, że możemy indywidualnie wymienić poszczególne zmienne. – templatetypedef

33

Lista przechwytywania lambda. Udostępnia zmienne dla lambda. Można użyć wartości [=], która kopiuje według wartości lub [&], która przechodzi przez odniesienie.

+2

Możesz także użyć '[]', który niczego nie przechwytuje. :) –

+0

Tak, to prawda. :-) – kometen