C++ Academy · Lektion

Lambda-uttryck: capture, mutable och generiska parametrar

Skriv lambdor med captures, mutable-semantik och generiska auto-parametrar

Lektion 3 av 413 steg

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);   // 25

Syntaxens 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;   // 3

Standardinfå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, b

Muterbara 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 scope

Deduktion 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);       // double

Lambdor 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.

Gratis att börja

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

  1. auto, decltype och typinferens
  2. Range-baserad for, nullptr och enum class
  3. Lambda-uttryck: capture, mutable och generiska parametrar
  4. Strukturerade bindningar och if-init i C++17
← Tillbaka till C++ Academy