提问者:小点点

试图转发函数指针时出现编译器错误


我有下面的代码,做一些可调用对象的转发。 我希望能够用函数指针调用g,但这会导致编译器错误。

#include <utility>

template<typename Fn>
void f(Fn&&)
{
}

template<typename Fn>
auto g(Fn&& fn)
{
  return [fn_ = std::forward<Fn>(fn)]() mutable { f(std::forward<Fn>(fn_)); };
}

int h()
{
  return 42;
}

int main()
{
  g(h)();
  return 0;
}

(https://godbolt.org/z/mhqyzp)

这导致:

<source>: In instantiation of 'auto g(Fn&&) [with Fn = int (&)()]':
<source>:21:6:   required from here
<source>:11:69: error: no matching function for call to 'forward<int (&)()>(int (*&)())'
   11 |   return [fn_ = std::forward<Fn>(fn)]() mutable { f(std::forward<Fn>(fn_)); };

为什么不能用这种方式转发一个函数指针呢? 下面的编译非常好:

...

int main()
{
  g([] { return 42; })();
  return 0;
}

共1个答案

匿名用户

您应该在这里使用std::move而不是std::forward,因为fn_是字段,而不是函数参数。