Lambda-uttryck: capture, mutable och generiska parametrar
Skriv lambdor med captures, mutable-semantik och generiska auto-parametrar
Lambda-uttryck: capture, mutable och generiska parametrar är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad är en lambda?
En lambda är ett anonymt inline-funktionsobjekt. Använd den där Ni annars skulle skriva en liten namngiven funktion eller en struct med operator().
auto square = [](int x) { return x * x; };
std::cout << square(5); // 25Syntaxens delar
En lambda består av fyra delar:
[capture]— vilka variabler från det omgivande omfånget som ska användas(parameters)— som en parameterlista för en funktion-> return_type— valfri, deduceras ofta{ body }
Tom infångning
[] betyder "fånga ingenting". Lambdan kommer bara åt globala och statiska variabler.
auto add = [](int a, int b) { return a + b; };Infångning med värde
Lista variabler i infångningsklausulen för att kopiera dem till lambdan.
int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3); // 15 (captured n was 5)Infångning med referens
Inled med & för att fånga med referens. Ändringar i lambdan påverkar den yttre variabeln.
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter; // 3Standardinfångning: [=] och [&]
Fånga allt som används med värde med [=], eller allt med referens med [&]. Använd detta med försiktighet — var explicit när Ni kan.
auto f = [=]() { return a + b; }; // copies a, b
auto g = [&]() { return a + b; }; // references a, bMuterbara lambdor
Som standard är värdeinfångningar const inuti lambdan. Lägg till mutable om Ni vill kunna ändra dem — ändringarna påverkar bara lambdans kopia.
int n = 5;
auto f = [n]() mutable {
n += 1; // OK because of mutable
return n;
};
f(); f(); // returns 6, then 7
std::cout << n; // still 5 in outer scopeDeduktion av returtyp
Kompilatorn deducerar returtypen från kroppen. Gör den explicit när det behövs.
auto half = [](int x) -> double { return x / 2.0; };Generiska lambdor (C++14)
Använd auto i parameterlistan för att få en generisk lambda som fungerar med alla typer.
auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42); // int
print("hello"); // const char*
print(3.14); // doubleLambdor som funktionsargument
STL-algoritmer tar emot lambdor som predikat och transformationer.
std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });Lambdor är funktionsobjekt
Under huven genererar kompilatorn en klass med operator(). Ni kan lagra lambdor i std::function eller auto.
Snabb kontroll
Kan Ni tilldela ett värde till n i lambdan [n](int x) { return x * n; } utan att göra lambdan mutable?
Sammanfattning
Lambdor är anonyma inline-funktionsobjekt. Fånga med värde eller referens, markera med mutable om värdeinfångningar ska kunna ändras och använd auto-parametrar för generiska lambdor i C++14 och senare.
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Lambda-uttryck: capture, mutable och generiska parametrar” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Lambda-uttryck: capture, mutable och generiska parametrar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Lambda-uttryck: capture, mutable och generiska parametrar”?
Skriv lambdor med captures, mutable-semantik och generiska auto-parametrar Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Lambda-uttryck: capture, mutable och generiska parametrar”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- auto, decltype och typinferens
- Range-baserad for, nullptr och enum class
- Lambda-uttryck: capture, mutable och generiska parametrar
- Strukturerade bindningar och if-init i C++17