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))>();
^
[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
@DyP aaahh, un operatore runtime è in errore. Si prega di incollare come risposta. – user1095108
Se sapessi * perché * non è necessario essere 'constexpr', allora forse;) – dyp