0Pricing
C++ Academy · Lektion

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;   // 2

Standard-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 dangles

Capture-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 lambda

this 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 dangles

Schnelltest

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

  1. Funktionsobjekte und Funktoren
  2. Lambda-Captures: per Wert, per Referenz, mutable
  3. Generische Lambdas und Closures in C++14
  4. std::function: typgelöschte aufrufbare Objekte
← Zurück zu C++ Academy