Durante l'utilizzo di alcuni oggetti lambda locali in una funzione C++ 11, ero tentato di dichiararli come const static auto lambda = ...
solo per far sapere al compilatore che c'è un solo oggetto std::function
necessario (e possibilmente ottimizzare la chiamata e/o in linea) ma mi sono reso conto che catturare i valori locali per riferimento in questa circostanza porta a comportamenti strani.const static auto lambda utilizzato con acquisizione per riferimento
Si consideri il seguente codice:
void process(const Data& data, const std::function<void(DataElement&>& lambda) {
...
}
void SomeClass::doSomething()
{
int foo = 0;
const static auto lambda = [&foo]() { .... ++foo; .... }
process(data, lambda);
}
Questo non funziona con molteplici invocazioni doSomething()
ma i meccanici non è chiaro.
- Is
foo
legato alla prima invocazione e poi tenuto legato a un indirizzo di stack, che non è più valido sul invocazioni successive? - Sono obbligato a lasciare in questo caso lo
static
?
Dove è specificato questo comportamento nello standard? Considerando che è una variabile static
dove è costruita? Pigramente alla prima chiamata di doSomething()
(in modo che la prima invocazione funzioni) o all'avvio del programma?
Ad ogni modo, attualmente, si costruisce 'std :: function' dal lambda ad ogni chiamata. (e la creazione del tuo lambda è leggera). – Jarod42
Perché non 'static int foo = 0;'? Dato che c'è un solo lambda legato a 'pippo', probabilmente non hai bisogno di più copie di' foo'. – MSalters