C++ Academy · Lezione

Espressioni lambda: capture, mutable e generiche

Scriva lambda con capture, semantica mutable e parametri generici auto

Lezione 3 di 413 passaggi

Espressioni lambda: capture, mutable e generiche è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Che cos'è una lambda?

Una lambda è un oggetto funzione anonimo inline. La usi nei casi in cui altrimenti scriverebbe una piccola funzione con nome o una struct con operator().

auto square = [](int x) { return x * x; };
std::cout << square(5);   // 25

Anatomia della sintassi

Una lambda ha quattro parti:

  • [capture] — le variabili dell'ambito circostante da utilizzare
  • (parameters) — come l'elenco dei parametri di una funzione
  • -> return_type — facoltativo, spesso dedotto
  • { body }

Cattura vuota

[] significa «non catturare nulla». La lambda accede solo a variabili globali e statiche.

auto add = [](int a, int b) { return a + b; };

Cattura per valore

Indichi le variabili nella clausola di cattura per copiarle nella lambda.

int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3);   // 15 (captured n was 5)

Cattura per riferimento

Anteponi & per catturare per riferimento. Le modifiche apportate all'interno della lambda influiscono sulla variabile esterna.

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

Catture predefinite: [=] e [&]

Catturi tutto ciò che viene utilizzato per valore con [=], oppure tutto per riferimento con [&]. Usi questa possibilità con cautela: quando può, sia esplicito.

auto f = [=]() { return a + b; };   // copies a, b
auto g = [&]() { return a + b; };   // references a, b

Lambda mutabili

Per impostazione predefinita, le catture per valore sono const all'interno della lambda. Aggiunga mutable per poterle modificare: le modifiche influiscono solo sulla copia nella lambda.

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

Deduzione del tipo restituito

Il compilatore deduce il tipo restituito dal corpo. Lo renda esplicito quando necessario.

auto half = [](int x) -> double { return x / 2.0; };

Lambda generiche (C++14)

Usi auto nell'elenco dei parametri per ottenere una lambda generica, compatibile con qualsiasi tipo.

auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42);          // int
print("hello");    // const char*
print(3.14);       // double

Lambda come argomenti di funzione

Gli algoritmi STL accettano lambda come predicati e trasformazioni.

std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });

Le lambda sono oggetti funzione

Internamente, il compilatore genera una classe con operator(). Può memorizzare le lambda in std::function o in auto.

Verifica rapida

All'interno di una lambda [n](int x) { return x * n; }, può assegnare un valore a n senza rendere la lambda mutable?

Riepilogo

Le lambda sono oggetti funzione anonimi inline. Catturi per valore o per riferimento, usi mutable per modificare le catture per valore e utilizzi parametri auto per le lambda generiche in C++14 e versioni successive.

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Espressioni lambda: capture, mutable e generiche» è gratuita?

Sì — il testo completo di «Espressioni lambda: capture, mutable e generiche» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Espressioni lambda: capture, mutable e generiche»?

Scriva lambda con capture, semantica mutable e parametri generici auto Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Espressioni lambda: capture, mutable e generiche»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. auto, decltype e deduzione dei tipi
  2. Range-based for, nullptr ed enum class
  3. Espressioni lambda: capture, mutable e generiche
  4. Structured bindings e if-init in C++17
← Torna a C++ Academy