Lambda-captures efter værdi, efter reference, mutable
Vælg capture-klausuler med omtanke, og forstå lambdas tilstand
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; // 2Standardindfangning: =
[=] 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 danglesKombination 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 lambdaIndfangning 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 danglesHurtig 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.
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
- Funktionsobjekter og funktorer
- Lambda-captures efter værdi, efter reference, mutable
- Generiske lambdaer og closures i C++14
- std::function – typeudviskede callable-objekter