Lambda-Captures: per Wert, per Referenz, mutable
Wählen Sie Capture-Klauseln bewusst und verstehen Sie den Zustand von Lambdas.
Lambda-Captures: per Wert, per Referenz, mutable ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Zusammenfassung zu Captures
Die Capture-Klausel eines Lambda-Ausdrucks listet Variablen aus dem umgebenden Gültigkeitsbereich auf, die er verwenden darf. Der Capture-Modus legt fest, wie auf die einzelnen Variablen zugegriffen wird.
Capture per Wert
Namen ohne & werden beim Erstellen des Lambdas kopiert. Das Lambda besitzt seine eigene Kopie.
int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f(); // 10 (captured n was 5)Capture per Referenz
Namen mit & werden als Referenzen auf die äußere Variable gespeichert. Änderungen werden in beide Richtungen übernommen.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter; // 2Standard-Capture: =
[=] erfasst alles Verwendete im Rumpf des Lambdas per Wert. Das ist praktisch, kann aber überraschen – erfasst werden nur die referenzierten Variablen.
int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; }; // captures a and c (not b)Standard-Capture: &
[&] erfasst alles Verwendete per Referenz. Seien Sie vorsichtig: Referenzen auf lokale Variablen hängen ins Leere, wenn das Lambda den Gültigkeitsbereich überlebt.
int n = 0;
auto bad = [&]() { return n; };
return bad; // n dies, lambda danglesCapture-Modi kombinieren
Kombinieren Sie ein Standard-Capture mit spezifischen Captures. Listen Sie einzelne Variablen auf, um das Standardverhalten zu überschreiben.
int a = 1, b = 2;
auto f = [=, &b]() { // a by value, b by reference
return a + b;
};Veränderliche Lambdas
Per Wert erfasste Variablen sind innerhalb des Lambdas const. Fügen Sie mutable hinzu, damit das Lambda seine erfasste Kopie ändern kann.
int n = 5;
auto inc = [n]() mutable {
++n;
return n;
};
inc(); inc();
std::cout << n; // 5 (outer unchanged)Init-Captures (C++14)
Erfassen Sie das Ergebnis eines Ausdrucks unter einem neuen Namen. Dadurch werden Captures per Move und berechnete Anfangswerte möglich.
auto ptr = std::make_unique<int>(42);
auto f = [p = std::move(ptr)]() {
return *p;
};
// ptr is now empty; p owns the int inside the lambdathis erfassen
Innerhalb einer Memberfunktion erfasst [this] den this-Zeiger – alle Member sind innerhalb des Lambdas zugänglich.
*this erfassen (C++17)
[*this] kopiert das gesamte Objekt in das Lambda. Das ist nützlich, wenn das Lambda länger als das ursprüngliche Objekt lebt.
Fallstrick: Capture per Referenz und Asynchronität
Erfassen Sie lokale Variablen niemals per Referenz in einem Lambda, das asynchron ausgeführt wird – die lokalen Variablen werden wahrscheinlich zerstört, bevor das Lambda ausgeführt wird.
// BUG
int local = 42;
std::async([&local]() { use(local); }); // local dies, lambda danglesSchnelltest
Welcher Capture-Modus ist richtig, damit ein Lambda den Besitz eines std::unique_ptr aus dem äußeren Gültigkeitsbereich übernimmt?
Zusammenfassung
Capture per Wert kopiert, Capture per Referenz erzeugt Aliase. Verwenden Sie die Standard-Captures [=] oder [&] mit Bedacht. mutable erlaubt das Ändern per Wert erfasster Kopien. Init-Captures (C++14) ermöglichen Captures per Move.
Häufig gestellte Fragen
Ist die Lektion „Lambda-Captures: per Wert, per Referenz, mutable“ kostenlos?
Ja — der vollständige Text von „Lambda-Captures: per Wert, per Referenz, mutable“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Lambda-Captures: per Wert, per Referenz, mutable“?
Wählen Sie Capture-Klauseln bewusst und verstehen Sie den Zustand von Lambdas. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Lambda-Captures: per Wert, per Referenz, mutable“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Funktionsobjekte und Funktoren
- Lambda-Captures: per Wert, per Referenz, mutable
- Generische Lambdas und Closures in C++14
- std::function: typgelöschte aufrufbare Objekte