jeudi 8 janvier 2015

Why can't I pass a lambda to this function which takes a std::function?

The following program is illegal, and I would like to understand why:



#include <functional>
#include <iostream>

template<typename Result, typename Arg>
void deduce(std::function<Result(Arg)> f)
{
std::cout << "Result: " << typeid(Result).name() << std::endl;
std::cout << "Arg: " << typeid(Arg).name() << std::endl;
}


int main()
{
auto f = [](int x)
{
return x + 1;
};

deduce(f);

return 0;
}


clang's output:



$ clang -std=c++11 test.cpp
test.cpp:48:3: error: no matching function for call to 'deduce'
deduce(f);
^~~~~~
test.cpp:26:6: note: candidate template ignored: could not match 'function<type-parameter-0-1 (type-parameter-0-0)>' against '<lambda at test.cpp:34:13>'
void deduce(std::function<T2(T1)> f)
^
1 error generated.


It seems like I ought to be able to convert my lambda to the std::function received by deduce. Why is it not possible?


Aucun commentaire:

Enregistrer un commentaire