我正在编写像众所周知的 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
的调用是否真的有用?如果是这样的话?
感谢您的启发!
答案 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值选择适当的重载。