C++ - Lambdas: Unterschied zwischen "veränderlich" und capture-by-reference
In C++ können Sie erklären, Lambda-Ausdrücke zum Beispiel so:
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << '\n'; };
auto b = [&]() { ++x; std::cout << x << '\n'; };
Beide lassen mich ändern x
, was ist also der Unterschied?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was passiert
Den ersten nur ändern, eine eigene Kopie von
x
und verlassen die Außenseitex
unverändert.Mit dem zweiten ändern Sie die außerhalb
x
.Fügen Sie eine print-Anweisung ausprobiert:
Dies ist das erwartete zu drucken:
Warum
Kann es helfen zu beachten, dass die lambda
(siehe [expr.prim.lambda] der Standard)
Haben Sie
erklärt als
const
member-Funktion, aber nurKönnen Sie denken, als wenn
und
Q: Aber wenn es ein
const
Funktion, warum kann ich immer noch ändernx
?A: Sie ändern nur die die außerhalb
x
. Die lambda eigenenx
ist ein Verweis, und den Betrieb++x
nicht ändern die Referenz, aber der angegebene Wert.Dies funktioniert, weil in C++, der constness des einen Zeiger/Referenz ändert nicht die constness der pointee/referencee gesehen durch ihn.
a
einige Orte, die Sie gemeintb
. Und Ihre Objekte von anonymen Klasse Typ nicht Initialisierungen. Vielleicht möchten Sie erklären, wir sind pretendinglambda_a()
ist ein Konstruktor, obwohl die Klasse keinen Namen hat.const
macht eigentlich keinen Unterschied. Sie immer mutieren die referencee durch einen Verweis. Aber um ein anderes Beispiel anzuführen:int main () { int x; auto a = [=]() { ++x; }; }
. g++ wird eine Fehlermeldung geben, weil die[=]
bedeutet, dass die generierte Funktion Objekt bekommt seine eigene member-variablex
, aber der Mangel anmutable
bedeutet, dass einconst
member-function-call-operator erzeugt, daher diex
ist nicht übertragbar.auto c = [=]() { ++x; };
oben geben würde, ist mehr Klarheit darüber, warummutable
, und dort durchconst
, macht einen Unterschied.mutable
Qualifikation sollte standardmäßigconst
Spezifikation sollten explizit genannt werden.int sum = 0; std::for_each(vec.cbegin(), vec.cend(), [sum](int x) { sum += x;})
.