C++ Academy · Lektion

Lambda-captures efter værdi, efter reference, mutable

Vælg capture-klausuler med omtanke, og forstå lambdas tilstand

Lektion 2 af 413 trin

Lambda-captures efter værdi, efter reference, mutable er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Opsummering af indfangning

En lambdafunktions indfangningsklausul angiver variabler fra det omgivende område, som den kan bruge. Indfangningstilstanden bestemmer, hvordan hver variabel tilgås.

Indfangning efter værdi

Navne, der står uden &, kopieres, når lambdafunktionen oprettes. Lambdafunktionen ejer sin kopi.

int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f();   // 10 (captured n was 5)

Indfangning efter reference

Navne med & gemmes som referencer til den ydre variabel. Ændringer videreføres i begge retninger.

int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter;   // 2

Standardindfangning: =

[=] indfanger alt, der bruges i lambdafunktionens krop, efter værdi. Det er praktisk, men kan overraske — kun de variabler, der refereres til, indfanges.

int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; };   // captures a and c (not b)

Standardindfangning: &

[&] indfanger alt, der bruges, efter reference. Vær forsigtig — referencer til lokale variabler bliver ugyldige, hvis lambdafunktionen lever længere end området.

int n = 0;
auto bad = [&]() { return n; };
return bad;        // n dies, lambda dangles

Kombination af indfangningstilstande

Kombinér standardindfangning med specifikke indfangninger. Angiv individuelle variabler for at tilsidesætte standarden.

int a = 1, b = 2;
auto f = [=, &b]() {     // a by value, b by reference
    return a + b;
};

Ændringsbare lambdafunktioner

Variabler, der er indfanget efter værdi, er const inde i lambdafunktionen. Tilføj mutable for at lade lambdafunktionen ændre sin indfangede kopi.

int n = 5;
auto inc = [n]() mutable {
    ++n;
    return n;
};
inc(); inc();
std::cout << n;   // 5 (outer unchanged)

Indfangning med initialisering (C++14)

Indfang resultatet af et udtryk under et nyt navn. Det gør indfangning ved flytning og beregnede startværdier mulig.

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

Indfangning af this

Inde i en medlemsfunktion indfanger [this] this-pointeren — alle medlemmer er tilgængelige inde i lambdafunktionen.

Indfangning af *this (C++17)

[*this] kopierer hele objektet ind i lambdafunktionen. Det er nyttigt, når lambdafunktionen lever længere end det oprindelige objekt.

Faldgrube: indfangning efter reference og asynkron kørsel

Indfang aldrig lokale variabler efter reference i en lambdafunktion, der kører asynkront — de lokale variabler er sandsynligvis destrueret, før lambdafunktionen udføres.

// BUG
int local = 42;
std::async([&local]() { use(local); });   // local dies, lambda dangles

Hurtig kontrol

Hvilken indfangningstilstand er korrekt, hvis en lambdafunktion skal eje en std::unique_ptr fra det ydre område?

Opsummering

Indfangning efter værdi kopierer, mens indfangning efter reference opretter aliaser. Brug standarderne [=] eller [&] med omtanke. mutable gør det muligt at ændre kopier, der er indfanget efter værdi. Indfangning med initialisering (C++14) gør indfangning ved flytning mulig.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Lambda-captures efter værdi, efter reference, mutable” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Lambda-captures efter værdi, efter reference, mutable”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Lambda-captures efter værdi, efter reference, mutable”?

Vælg capture-klausuler med omtanke, og forstå lambdas tilstand Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Lambda-captures efter værdi, efter reference, mutable”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Funktionsobjekter og funktorer
  2. Lambda-captures efter værdi, efter reference, mutable
  3. Generiske lambdaer og closures i C++14
  4. std::function – typeudviskede callable-objekter
← Tilbage til C++ Academy