Warum haben Lambda-Funktionen in c ++ 11 keine function <> -Typen?

Ich spiele mit den Funktionsmerkmalen von c ++ 11 herum. Eine Sache, die ich merkwürdig finde, ist, dass der Typ einer Lambda-Funktion tatsächlich KEIN Funktionstyp <> ist. Darüber hinaus scheinen Lambdas nicht wirklich gut mit dem Typ-Inferencing-Mechanismus zu funktionieren.

Im Anhang finden Sie ein kleines Beispiel, in dem ich das Umkehren der beiden Argumente einer Funktion zum Hinzufügen von zwei Ganzzahlen getestet habe. (Der von mir verwendete Compiler war gcc 4.6.2 unter MinGW.) Im Beispiel war der Typ füraddInt_f wurde explizit mit der Funktion <> while definiertaddInt_l ist ein Lambda, dessen Typ typgeprüft istauto.

Als ich den Code kompilierte, wurde derflip Die Funktion kann die explizit typdefinierte Version von addInt akzeptieren, jedoch nicht die Lambda-Version.testCppBind.cpp:15:27: error: no matching function for call to 'flip(<lambda(int, int)>&)'

Die nächsten Zeilen zeigen, dass die Lambda-Version (sowie eine 'rohe' Version) akzeptiert werden kann, wenn sie explizit in den entsprechenden Funktionstyp <> umgewandelt wird.

Meine Fragen sind also:

Warum hat eine Lambda-Funktion keinefunction<> erst eintippen? Im kleinen Beispiel, warum nichtaddInt_l habenfunction<int (int,int)> als Typ, anstatt einen anderen zu haben,lambda Art? Was ist aus Sicht der funktionalen Programmierung der Unterschied zwischen einer Funktion / einem funktionalen Objekt und einem Lambda?

Wenn es einen fundamentalen Grund gibt, dass diese beiden unterschiedlich sein müssen. Ich habe gehört, dass Lambdas umgewandelt werden könnenfunction<> aber sie sind unterschiedlich. Handelt es sich um ein Designproblem / einen Designfehler von C ++ 11, ein Implementierungsproblem oder besteht ein Vorteil darin, die beiden so zu unterscheiden, wie sie sind? Es scheint, dass die Typ-Signatur vonaddInt_l Alleine hat genügend Informationen über die Parameter und Rückgabetypen der Funktion geliefert.

Gibt es eine Möglichkeit, das Lambda so zu schreiben, dass das oben erwähnte explizite Typ-Casting vermieden werden kann?

Danke im Voraus.

    //-- testCppBind.cpp --
    #include <functional>
    using namespace std;
    using namespace std::placeholders;

    template <typename T1,typename T2, typename T3>
    function<T3 (T2, T1)> flip(function<T3 (T1, T2)> f) { return bind(f,_2,_1);}

    function<int (int,int)> addInt_f = [](int a,int b) -> int { return a + b;};
    auto addInt_l = [](int a,int b) -> int { return a + b;};

    int addInt0(int a, int b) { return a+b;}

    int main() {
      auto ff = flip(addInt_f);   //ok
      auto ff1 = flip(addInt_l);  //not ok
      auto ff2 = flip((function<int (int,int)>)addInt_l); //ok
      auto ff3 = flip((function<int (int,int)>)addInt0);  //ok

      return 0;
    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage