Ho letto da qualche parte che una funzione lambda dovrebbe decadere per funzionare con il puntatore se la lista di cattura è vuota. L'unico riferimento che posso trovare ora è n3052. Con g ++ (4.5 & 4.6) funziona come previsto, a meno che la lambda non sia dichiarata nel codice del modello.Il decadimento lambda deve funzionare con il puntatore nel codice di modello?
Ad esempio, il seguente codice compilato:
void foo() {
void (*f)(void) = []{};
}
Ma non si compila più quando su modelli (se foo
è in realtà chiamato altrove):
template<class T>
void foo() {
void (*f)(void) = []{};
}
Nel riferimento sopra, don vediamo una spiegazione di questo comportamento. Si tratta di una limitazione temporanea di g ++, e se no, c'è una ragione (tecnica) per non permetterlo?
Nota che N3052, che citi, è stato effettivamente incorporato nel CCD 0x FCD (N3092 5.1.2/6). Visual C++ 2010 non implementa affatto la conversione (non sorprende, dal momento che il linguaggio che lo consentiva era incorporato nello standard così presto prima che VC++ venisse rilasciato). Ho inviato una segnalazione di bug su Microsoft Connect in merito (sebbene prevedo che non verrà risolta fino alla prossima versione di Visual C++): https://connect.microsoft.com/VisualStudio/feedback/details/572138/visual -c-2010-does-not-permit-conversion-of-captureless-lambda-to-function-pointer –
Proprio come una FYI: nessuno del codice sopra è supportato in Intel C++ 11.1 –
È già in bugtracker GCC, anche se come di ora non confermato: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45080 –