2013-09-07 10 views
5

Come sappiamo, i funtori lambda non acquisibili possono essere convertiti in puntatori funzione in fase di esecuzione, ma per quanto riguarda il tempo di compilazione? Cioè, è qualcosa di simile al codice qui sotto possibile? Per favore non suggerire una soluzione alternativa, come passare il funcdro lambda come parametro di funzione, mi piacerebbe sapere di più dove/come lo standard C++ 11 proibisce questo.Conversione in fase di compilazione dei funtori lambda in puntatori di funzioni

template <void(*fptr)()> 
void f() 
{ 
    // do something 
} 

int main() 
{ 
    auto l([]{}); 

    f<(void(*)())(decltype(l))>(); 

    return 0; 
} 

L'errore obbligatoria con gcc-4.8:

c.cpp: In function 'int main()': 
c.cpp:11:7: error: parse error in template argument list 
     f<(void(*)())(decltype(l))>(); 
    ^
c.cpp:11:36: error: statement cannot resolve address of overloaded function 
     f<(void(*)())(decltype(l))>(); 
            ^
+4

[expr.prim.lambda]/6 "Il tipo di chiusura per un'espressione lambda non generica senza lambda-capture ha una funzione di conversione const costante non virtuale non per puntare alla funzione [... ] "e non è necessario essere' constexpr'. – dyp

+0

@DyP aaahh, un operatore runtime è in errore. Si prega di incollare come risposta. – user1095108

+2

Se sapessi * perché * non è necessario essere 'constexpr', allora forse;) – dyp

risposta

2

espressioni lambda, anche con una chiusura vuoto, può non essere usato come un puntatore a funzione argomento di un template, perché sono provvisori che ha appena capita di convertire in un puntatore per funzionare. L'espressione lambda è temporanea secondo 5.1.2 [expr.prim.lambda] paragrafo 2:

La valutazione di un'espressione lambda risulta in un valore provvisorio. [...]

La conversione a un puntatore a funzione è desribed al paragrafo 6:

Il tipo di chiusura per una lambda espressione senza lambda-acquisizione ha un non non virtuale pubblica - Funzione di conversione const esplicita per puntare alla funzione con lo stesso parametro e tipi di ritorno dell'operatore di chiamata di funzione del tipo di chiusura. Il valore restituito da questa funzione di conversione deve essere l'indirizzo di una funzione che, invocata, ha lo stesso effetto del richiamo dell'operatore di chiamata di funzione del tipo di chiusura.

Cioè, la conversione non produce uno constexpr e, quindi, non c'è speranza di usare il puntatore risultante per funzionare come argomento modello.

Per quanto riguarda i motivi il meglio che ho potuto trovare per ora è una dichiarazione in N3597 che punta verso N2895 che sembrano parlare del problema reale ma non sono riuscito a trovare una discussione dettagliata. Sembra che il manomissione dei nomi per le funzioni create dalle espressioni lambda sia uno dei problemi che vieta di utilizzarli in determinati contesti.

Problemi correlati