Ich möchte einen Funktionszeiger auf eine Lambda in C++ in der Lage sein zu erhalten.Funktionszeiger auf Lambda bekommen?
ich tun kann:
int (*c)(int) = [](int i) { return i; };
Und natürlich, die folgenden Werke - auch wenn es einen Funktionszeiger nicht ist zu schaffen.
auto a = [](int i) { return i; };
Aber die folgenden:
auto *b = [](int i) { return i; };
gibt diesen Fehler in 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)>'
Es scheint willkürlich, dass eine Lambda auf einen Funktionszeiger ohne Problem umgewandelt werden, aber der Compiler kann den Funktionstyp nicht ableiten und mit auto *
einen Zeiger darauf erstellen. Vor allem, wenn es implizit eine unique, lambda type
auf einen Funktionszeiger umwandeln kann:
int (*g)(int) = a;
Ich habe ein wenig Prüfstand bei http://coliru.stacked-crooked.com/a/2cbd62c8179dc61b schaffen, die die obigen Beispiele enthält. Dieses Verhalten ist das gleiche unter C++ 11 und C++ 14.
Regeln für 'auto' Abzug sind sehr ähnlich zu der Vorlage Abzug. Hier haben Sie Abzug und Umrechnung: Sie können nur eine haben. – milleniumbug
Ich möchte den Fragetitel in "Warum führt Auto * keinen Funktionszeigertyp von einem Lambda ableiten?" um dies zu einer konkreten Frage zu machen. Das scheint dich zu verwirren. Aber würden Sie lieber etwas mehr wie "Wie bekomme ich einen Funktionszeiger von einem Lambda, ohne den Typ zu schreiben?" –
Dieser erste Titel klingt gut. – oconnor0