std::forward<Func> 在调用时的效用

Utility of std::forward<Func> at call

我正在编写像众所周知的 tuple_apply 这样的函数,它以函数的右值引用作为参数。 在网上研究期间,我遇到了以下两个调用:

template <
    typename Func,
    /* stuff */
>
void myfunction(Func && func, /* stuff */)
{
    std::forward<Func>(func)(/* stuff */); // use of std::forward before call
    func(/* stuff */);                     // direct call
}

这个对 std::forward 的调用真的有用吗?如果是,为什么?

多谢指教!

在大多数情况下,这两个选项之间没有区别。然而,Func 可能有 ref-qualified operator()。像下面这样:

struct Func {
    operator()(/* stuff */) &&;
}

这只能在右值上调用,所以第二次调用不会编译,因为 myfunction 中的 func 是左值。或者它可以有引用限定的重载:

struct Func {
    operator()(/* stuff */) &;
    operator()(/* stuff */) &&;
}

在这种情况下,没有 std::forward 的调用将使用第一个重载,而不管传递给 myfunction 的是什么:左值或右值。另一方面,使用 std::forward 的调用将根据传递的 func 对象的左值选择适当的重载。