Jak wiemy, nie przechwytujące funktory lambda można przekonwertować na wskaźniki funkcji w czasie wykonywania, ale co z czasem kompilacji? Czy możliwe jest coś podobnego do poniższego kodu? Proszę nie sugerować obejścia problemu, np. Przekazanie funktora lambdy jako parametru funkcji, chciałbym dowiedzieć się więcej o tym, gdzie/jak standard C++ 11 zabrania tego.Konwersja czasu kompilacji funktorów lambda na wskaźniki funkcji
template <void(*fptr)()>
void f()
{
// do something
}
int main()
{
auto l([]{});
f<(void(*)())(decltype(l))>();
return 0;
}
Obowiązkowe błąd z 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 "Typ zamknięcia dla niepojedynczego wyrażenia lambda bez przechwytywania lambda ma publiczną, nie-wirtualną, inną niż jawną funkcję konwersji stałej na wskaźnik do funkcji [... ] "i nie musi być" constexpr ". – dyp
@DyP aaahh, działa operator wykonawczy. Wklej jako odpowiedź. – user1095108
Gdybym wiedział * dlaczego * nie musi być "constexpr", to może;) – dyp