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