0Pricing
C++ Academy · Lezione

Capture delle lambda: per valore, per riferimento, mutable

Scelga con attenzione le clausole di capture e comprenda lo stato delle lambda

Capture delle lambda: per valore, per riferimento, mutable è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 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.

Riepilogo delle catture

La clausola di cattura di una lambda elenca le variabili dell'ambito circostante che può utilizzare. La modalità di cattura controlla il modo in cui ogni variabile viene acceduta.

Cattura per valore

I nomi elencati senza & vengono copiati al momento della creazione della lambda. La lambda possiede la propria copia.

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

Cattura per riferimento

I nomi preceduti da & vengono memorizzati come riferimenti alla variabile esterna. Le modifiche si propagano in entrambe le direzioni.

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

Cattura predefinita: =

[=] cattura per valore tutto ciò che viene usato nel corpo della lambda. È comodo, ma può sorprendere: vengono catturate solo le variabili a cui si fa riferimento.

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

Cattura predefinita: &

[&] cattura per riferimento tutto ciò che viene usato. Prestate attenzione: i riferimenti a variabili locali diventano pendenti se la lambda sopravvive all'ambito.

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

Combinare le modalità

Combin ate la cattura predefinita con catture specifiche. Elencate le singole variabili per sovrascrivere la modalità predefinita.

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

Lambda mutabili

Le variabili catturate per valore sono const all'interno della lambda. Aggiungete mutable per consentire alla lambda di modificare la propria copia catturata.

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

Catture con inizializzazione (C++14)

Catturate il risultato di un'espressione assegnandogli un nuovo nome. Questo consente la cattura tramite move e l'uso di valori iniziali calcolati.

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

Catturare this

All'interno di una funzione membro, [this] cattura il puntatore this: tutti i membri sono accessibili all'interno della lambda.

Catturare *this (C++17)

[*this] copia l'intero oggetto nella lambda. È utile quando la lambda sopravvive all'oggetto originale.

Problema: cattura per riferimento e asincronia

Non catturate mai variabili locali per riferimento in una lambda eseguita in modo asincrono: è probabile che le variabili locali vengano distrutte prima dell'esecuzione della lambda.

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

Verifica rapida

Quale modalità di cattura è corretta per consentire a una lambda di mantenere la proprietà di uno std::unique_ptr proveniente dall'ambito esterno?

Riepilogo

La cattura per valore copia, mentre quella per riferimento crea un alias. Utilizzate con attenzione le catture predefinite [=] o [&]. mutable consente di modificare le copie catturate per valore. Le catture con inizializzazione (C++14) consentono la cattura tramite move.

Domande Frequenti

La lezione «Capture delle lambda: per valore, per riferimento, mutable» è gratuita?

Sì — il testo completo di «Capture delle lambda: per valore, per riferimento, mutable» è 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 «Capture delle lambda: per valore, per riferimento, mutable»?

Scelga con attenzione le clausole di capture e comprenda lo stato delle lambda 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 2 di 4.

Quanto tempo richiede la lezione «Capture delle lambda: per valore, per riferimento, mutable»?

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. Oggetti funzione e functor
  2. Capture delle lambda: per valore, per riferimento, mutable
  3. Lambda generiche e closure in C++14
  4. std::function: oggetti chiamabili type-erased
← Torna a C++ Academy