Gemäß dem C++ 11-Standard können Lambda-Ausdrücke Variablen im umschließenden Gültigkeitsbereich mithilfe der Erfassungsliste, der Parameterliste oder beiden verwenden.C++ Lambdas: Erfassungsliste vs. Parameterliste
Schauen wir uns also zwei Versionen desselben Codes an.
1) mit Fänger
int x = 4;
cout << "With capture : Factorial of " << x << " = " << [x]() // <= Capture
{
int r = 1;
for (int i = x; i > 1; i--) r = r * i;
return r;
}() << endl;
2) Mit dem Parameter
int x = 4;
cout << "With parameter: Factorial of " << x << " = " << [](int x) // <= Parameter
{
int r = 1;
for (int i = x; i > 1; i--) r = r * i;
return r;
}(x) << endl;
Der Ausgang ist:
With capture : Factorial of 4 = 24
With parameter: Factorial of 4 = 24
Da wir Parameter Lambdas in der Parameterliste übergeben können (genau wie bei jeder C++ Funktion), warum brauchen wir die Aufnahmeliste?
Kann mir jemand Fälle zeigen, in denen die Parameterliste nicht funktioniert und nur die Erfassungsliste funktioniert?
können wir nicht beide 'a' und 'faktor' in der Parameterliste übergeben und das Capture leer lassen? –
@ Xicod'Abrolha Wie? Du rufst das Lambda nicht auf, 'std :: find_if' macht es. Wie würdest du die Funktion anders nennen? – Angew
kein Xico, können Sie nicht! in der find_if Code irgendwo haben Sie etwas, das Ihre Lambda (oder Funktion) wie folgt ruft: Handler (Wert); für jeden Wert im Bereich Beginn/Ende. –