调用</func>时std :: forward <func>的效用

时间:2015-04-15 21:31:13

标签: c++ c++11 perfect-forwarding

我正在编写像众所周知的 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的调用是否真的有用?如果是这样的话?

感谢您的启发!

1 个答案:

答案 0 :(得分:2)

在大多数情况下,这两个选项之间没有区别。但是,Func可能已经重新定级operator()。如下所示:

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

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

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

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