la mia esperienza sembra che sia:C++ Indirizzo di oggetti lambda come parametri alle funzioni
- un'espressione lambda creato all'interno di una chiamata di funzione viene distrutta subito dopo l'invocazione
- Chiamata di una funzione che si aspetta un
std::function
crea un oggetto temporaneo (std :: funzione) dal lambda, e l'oggetto viene distrutto dopo l'invocazione
Questo comportamento può essere osservato con il seguente frammento di codice:
0.123,51641 milioniconst function<void()>* pointer;
void a(const function<void()> & f)
{
pointer = &f;
}
void b()
{
(*pointer)();
}
int main()
{
int value = 1;
std::cout << &value << std::endl;
// 1: this works
function<void()> f = [&]() { std::cout << &value << std::endl; };
a(f);
// 2: this doesn't
a([&]() { std::cout << &value << std::endl; });
/* modify the stack*/
char data[1024];
for (int i = 0; i < 1024; i++)
data[i] = i % 4;
b();
return 0;
}
Che cosa sta effettivamente accadendo nel secondo caso? C'è un modo corretto per chiamare a()
senza creare un oggetto esplicito std::function
?
Edit:: Questo entrambe le versioni (1 e 2) compilare solo di destra, ma causa di variazioni uscite:
Versione 1:
0x7fffa70148c8
0x7fffa70148c8
Versione 2:
0x7fffa70148c8
0
Cosa vuoi dire che il secondo caso "non funziona"? Compila? Crolla? Scrive "non funziona" sulla tua stampante? – jalf
@jalf: Hai dimenticato: si ferma e prende fuoco. – Grizzly
/* modifica lo stack */La maggior parte dei compilatori prealloca lo spazio necessario per ** tutte ** le variabili locali al momento dell'inserimento della funzione. –