为什么我不能将 lambda 传递给这个采用 std::函数的函数?

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

本文关键字:函数 std 不能 lambda 为什么      更新时间:2023-10-16

以下程序是非法的,我想了解原因:

#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并返回int的lambda可以转换为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
相关文章: