我有下面的代码,做一些可调用对象的转发。 我希望能够用函数指针调用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;
}
您应该在这里使用std::move
而不是std::forward
,因为fn_
是字段,而不是函数参数。