标准::<Func>呼叫时转发的效用

Utility of std::forward<Func> at call

本文关键字:转发 gt lt Func 标准 呼叫      更新时间:2023-10-16

我正在编写像众所周知的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可能具有参考资格operator()。如下所示:

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

这只能在 r 值上调用,因此第二次调用不会编译,因为 myfunction 内部func是 l 值。或者它可以具有引用限定的重载:

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

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