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
对象的左值选择适当的重载。
我正在编写像众所周知的 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
对象的左值选择适当的重载。