Was bedeutet [=] in C ++?

93

Ich möchte wissen was [=]macht? Hier ist ein kurzes Beispiel

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);

Wie würde der Code funktionieren []anstatt [=]?

Ich nehme das an

std::function<T (T)>

bedeutet ein Funktionsprototyp, der (T)als Argument und Rückgabetyp erhält T?

der_lord
quelle
4
Dies ist bizarr hoch gewählt für etwas, das 3 verschiedene nicht erforschte Fragen zu stellen scheint und ein Duplikat von Was ist ein Lambda-Ausdruck in C ++ 11?
underscore_d
Ich stimme @underscore_d zu - Es sieht so aus, als würde ein Klick die Bewertung verbessern, oder? :)
BitTickler

Antworten:

108

Das, auf das [=]Sie sich beziehen, ist Teil der Erfassungsliste für den Lambda-Ausdruck. Dies teilt C ++ mit, dass der Code im Lambda-Ausdruck initialisiert wird, sodass das Lambda eine Kopie aller lokalen Variablen erhält, die es beim Erstellen verwendet. Dies ist notwendig , dass der Lambda - Ausdruck beziehen zu können factorund offset, die lokalen Variablen innerhalb der Funktion sind.

Wenn Sie die ersetzen [=]mit [], werden Sie einen Compiler - Fehler erhalten , weil der Code innerhalb der Lambda - Ausdruck nicht wissen , was die Variablen offsetund factorbeziehen sich auf. Viele Compiler geben in diesem Fall gute Diagnosefehlermeldungen aus. Probieren Sie es aus und sehen Sie, was passiert!

templatetypedef
quelle
13
"Dies ist notwendig" - genau diese Option ist nicht erforderlich; wir könnten auch schreiben [&], [=offset, =input]etc.
MM
1
@MM - Erfasst das nicht Verweise auf Einheimische?
Nutzlos
5
@MM Die Verwendung einer Referenzerfassung wäre hier ein Problem, da die Lebensdauer dieser lokalen Variablen endet, sobald das Lambda zurückgegeben wird. Sie haben Recht, dass wir die einzelnen Variablen jedoch einzeln auflisten können.
Templatetypedef
45

Es ist eine Lambda- Erfassungsliste. Stellt Variablen für das Lambda zur Verfügung. Sie können verwenden, [=]welche Kopien nach Wert oder [&]welche als Referenz übergeben werden.

kometen
quelle
3
Sie können auch verwenden, []was nichts erfasst. :)
Daniel Kamil Kozar