Co oznacza [=] w C ++?

94

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

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 kod działałby z []zamiast [=]?

zakładam, że

std::function<T (T)>

oznacza prototyp funkcji, który otrzymuje (T)jako argument i zwraca typ T?

der_lord
źródło
4
To dziwacznie, wysoko głosowane na coś, co wydaje się zadawać 3 różne niezbadane pytania i jest duplikatem Co to jest wyrażenie lambda w C ++ 11?
underscore_d
Zgadzam się z @underscore_d - Wygląda na to, że niektóre kliknięcia poprawiają ocenę, prawda? :)
BitTickler

Odpowiedzi:

108

To, do [=]którego się odnosisz, jest częścią listy przechwytywania wyrażenia lambda. To mówi C ++, że kod wewnątrz wyrażenia lambda jest inicjowany, tak aby lambda otrzymała kopię wszystkich zmiennych lokalnych, których używa podczas tworzenia. Jest to konieczne, aby wyrażenie lambda mogło odwoływać się do factori offset, które są zmiennymi lokalnymi wewnątrz funkcji.

Jeśli zastąpi [=]się [], dostaniesz błąd kompilatora, ponieważ kod wewnątrz wyrażenia lambda nie będzie wiedział, co zmienne offseti factordotyczą. Wiele kompilatorów wyświetla dobre diagnostyczne komunikaty o błędach, jeśli to zrobisz, więc spróbuj i zobacz, co się stanie!

templatetypedef
źródło
13
„To jest konieczne” - ta dokładna opcja nie jest konieczna; możemy też napisać [&], [=offset, =input]itp.
MM
1
@MM - Czy to nie obejmuje odniesień do mieszkańców?
Bezużyteczne
5
@MM Użycie w tym miejscu przechwytywania referencji mogłoby stanowić problem, ponieważ okresy istnienia tych zmiennych lokalnych kończą się natychmiast po zwróceniu wartości lambda. Masz jednak rację, że moglibyśmy wymienić poszczególne zmienne indywidualnie.
templatetypedef
46

To lista przechwytywania lambda . Udostępnia zmienne dla lambda. Możesz użyć, [=]które kopie według wartości lub [&]które są przekazywane przez odwołanie.

kometen
źródło
3
Możesz także użyć, []który niczego nie przechwytuje. :)
Daniel Kamil Kozar