Je veux être capable d'obtenir un pointeur de fonction vers un lambda en C++.
Je peux le faire :
int (*c)(int) = [](int i) { return i; };
Et, bien sûr, ce qui suit fonctionne - même s'il ne crée pas un pointeur de fonction.
auto a = [](int i) { return i; };
Mais ce qui suit :
auto *b = [](int i) { return i; };
Donne cette erreur dans GCC :
main.cpp: In function 'int main()':
main.cpp:13:37: error: unable to deduce 'auto*' from '<lambda closure object>main()::<lambda(int)>{}'
auto *b = [](int i) { return i; };
^
main.cpp:13:37: note: mismatched types 'auto*' and 'main()::<lambda(int)>'
Il semble arbitraire qu'un lambda puisse être converti en pointeur de fonction sans problème, mais que le compilateur ne puisse pas déduire le type de la fonction et créer un pointeur vers celle-ci en utilisant la fonction auto *
. Surtout lorsqu'il peut convertir implicitement un unique, lambda type
à un pointeur de fonction :
int (*g)(int) = a;
J'ai créé un petit banc d'essai à http://coliru.stacked-crooked.com/a/2cbd62c8179dc61b qui contient les exemples ci-dessus. Ce comportement est le même sous C++11 et C++14.