2010-07-01 15 views
9

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?

+1

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 –

+0

Proprio come una FYI: nessuno del codice sopra è supportato in Intel C++ 11.1 –

+1

È già in bugtracker GCC, anche se come di ora non confermato: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45080 –

risposta

3

Non riesco a pensare a nessun motivo che sarebbe stato specificamente respinto. Immagino che sia solo una limitazione temporanea di g ++.

Ho provato anche un paio di altre cose:

template <class T> 
void foo(void (*f)(void)) {} 

foo<int>([]{}); 

che funziona.

typedef void (*fun)(void); 

template <class T> 
fun foo() { return []{}; } // error: Cannot convert. 

foo<int>()(); 

che non (ma non se foo non è parametrizzato).

Nota: ho eseguito il test solo in g ++ 4.5.

+0

Sì, nel primo caso il lambda è dichiarato in una porzione di codice non di modello (sebbene sia usato da una funzione template) . Lo stesso problema si verifica quando il lambda viene dichiarato all'interno di una classe template. – rafak

Problemi correlati