Lo standard C++ 11 afferma (o almeno, la versione che ho - non quella finale):Perché l'implicito "lambda to function pointer conversion" non consente l'acquisizione "per riferimento" di membri statici?
Il tipo di chiusura per una lambda espressione con senza lambda-capture ha un pubblica funzione di conversione const non esplicita non virtuale al puntatore per funzionare con gli stessi parametri e tipi di ritorno della chiusura operatore di chiamata di funzione del tipo .
Capisco perché non è possibile ottenere un puntatore a funzione da un lambda stateful poiché un puntatore a funzione non può contenere alcun dato da solo.
Ma quando gli oggetti catturati sono solo membri statici/variabile statica, non esiste tale limitazione poiché i riferimenti agli oggetti catturati possono essere cablati nella funzione stessa.
struct A {
static int count = 0;
void foo() {
static int bar = 0;
auto fun = [&]()->void {
count++;
bar++;
};
void(*ptrFun)();
ptrFun = fun; // forbidden by the quoted wording
}
};
Perché non è sempre possibile convertire un lambda in un puntatore di funzione non appena il primo è stateless? Mi manca qualcosa o il comitato ha dimenticato questo punto specifico?
Direi che è per evitare che i compilatori siano in grado di dimostrare qualcosa su ciò che viene catturato. – Flexo
Il compilatore è già in grado di acquisire automaticamente le variabili non appena vengono utilizzate (utilizzando l'automatico [&]), quindi non richiederà molto più lavoro per verificare se sono membri statici o globali poiché hanno necessariamente stato dichiarato prima. –
In realtà non l'ho testato su nessun compilatore (ho solo MSVC10 che non supporta affatto la conversione del puntatore a funzione). Immagino sia un'estensione GCC? Ad ogni modo, la mia domanda è: è permessa dallo standard (forse mi sono perso qualcosa)? Se no, perché è vietato (forse c'è una limitazione tecnica che non conosco)? –