为什么我不能将 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