Il codice seguente stampa 0, ma mi aspetto di vedere un 1. La mia conclusione è che le funzioni lambda non vengono invocate passando effettivamente i parametri catturati alle funzioni, che è più intuitivo. Ho ragione o mi manca qualcosa?C++ 11 cattura lambda per valore catturato al punto di dichiarazione
#include <iostream>
int main(int argc, char **argv){
int value = 0;
auto incr_value = [&value]() { value++; };
auto print_value = [ value]() { std::cout << value << std::endl; };
incr_value();
print_value();
return 0;
}
grazie. Stavo pensando al valore di-come in quanto gli aggiornamenti di valore non saranno visibili al di fuori della funzione. Tuttavia, sembra che questo significhi anche che gli aggiornamenti al di fuori della funzione non saranno visibili all'interno della funzione. – perreal
Quello che potrebbe essere fuorviante qui è la dicitura: per valore significa "genera una copia". Il lambda ha una copia della variabile, il suo valore è preso al punto di dichiarazione della lambda. Poiché il lambda ha una copia privata, l'oggetto originale non viene modificato o letto all'interno del lambda. Ecco perché in realtà esiste un'acquisizione per riferimento, per consentire il caso in cui si desidera vedere/modificare l'originale. – Klaim