dlaczego funkcje lambda w c ++ 11 nie mają funkcji typu <>?

Bawię się funkcjami c ++ 11. Jedną rzeczą, którą uważam za dziwną, jest to, że typ funkcji lambda NIE jest typem funkcji <>. Co więcej, wydaje się, że lambda nie gra zbyt dobrze z mechanizmem wnioskowania typu.

Dołączony jest małym przykładem, w którym przetestowałem przerzucanie dwóch argumentów funkcji w celu dodania dwóch liczb całkowitych. (Kompilatorem, którego użyłem był gcc 4.6.2 w MinGW.) W przykładzie typ dlaaddInt_f został jawnie zdefiniowany przy użyciu funkcji <> whileaddInt_l jest lambda, którego typ jest powiązany z typemauto.

Kiedy skompilowałem kod,flip funkcja może zaakceptować jawnie zdefiniowaną wersję addInt, ale nie wersję lambda, dając błąd mówiąc, żetestCppBind.cpp:15:27: error: no matching function for call to 'flip(<lambda(int, int)>&)'

Następne kilka wierszy pokazuje, że wersja lambda (jak również wersja „surowa”) może zostać zaakceptowana, jeśli jest jawnie rzutowana na odpowiednią funkcję <>.

Moje pytania to:

Dlaczego funkcja lambda nie mafunction<> w pierwszej kolejności? W małym przykładzie dlaczego nieaddInt_l miećfunction<int (int,int)> jako typ zamiast mieć innylambda rodzaj? Z punktu widzenia programowania funkcjonalnego, jaka jest różnica między obiektem funkcyjnym / funkcjonalnym a lambda?

Jeśli istnieje podstawowy powód, dla którego te dwa muszą być różne. Słyszałem, że można przekształcić lambdęfunction<> ale są różne. Czy jest to problem projektowy / wada C ++ 11, problem z implementacją, czy też istnieje korzyść z rozróżnienia tych dwóch, tak jak jest? Wygląda na to, że podpis typuaddInt_l sam dostarczył wystarczających informacji o parametrach i typach powrotu funkcji.

Czy istnieje sposób na zapisanie lambda, aby można było uniknąć wyżej wspomnianego jawnego rzutowania typu?

Z góry dziękuję.

    //-- 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;
    }

questionAnswers(2)

yourAnswerToTheQuestion