为什么我不能将 lambda 传递给这个接受 std::function 的函数?
Why can't I pass a lambda to this function which takes a std::function?
以下程序是非法的,想了解一下原因:
#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
的输出:
$ 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.
看来我应该能够将我的 lambda 转换为 deduce
接收到的 std::function
。为什么编译器无法在这种情况下应用适当的转换?
问题是,虽然采用 int
和 returns 的 lambda 和 int
可以 转换 为 std::function<int(int)>
,它的类型是不是std::function<int(int)>
,但我认为是任意实现定义的类型。
您可以通过告诉编译器您需要什么类型来解决这个问题。然后转换将按预期进行。
auto f = [](int x){ return x + 1; };
deduce<int, int>(f); // now ok
或者,明确 f
的静态类型。
std::function<int(int)> f = [](int x){ return x + 1; };
deduce(f); // now also ok
以下程序是非法的,想了解一下原因:
#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
的输出:
$ 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.
看来我应该能够将我的 lambda 转换为 deduce
接收到的 std::function
。为什么编译器无法在这种情况下应用适当的转换?
问题是,虽然采用 int
和 returns 的 lambda 和 int
可以 转换 为 std::function<int(int)>
,它的类型是不是std::function<int(int)>
,但我认为是任意实现定义的类型。
您可以通过告诉编译器您需要什么类型来解决这个问题。然后转换将按预期进行。
auto f = [](int x){ return x + 1; };
deduce<int, int>(f); // now ok
或者,明确 f
的静态类型。
std::function<int(int)> f = [](int x){ return x + 1; };
deduce(f); // now also ok