标准::<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
可能具有参考资格operator()
。如下所示:
struct Func {
operator()(/* stuff */) &&;
}
这只能在 r 值上调用,因此第二次调用不会编译,因为 myfunction
内部func
是 l 值。或者它可以具有引用限定的重载:
struct Func {
operator()(/* stuff */) &;
operator()(/* stuff */) &&;
}
在这种情况下,没有std::forward
的调用将使用第一个重载,而不管传递给myfunction
的内容:l值或r值。另一方面,带有 std::forward
的调用将根据传递的func
对象的 l 值来选择适当的重载。
相关文章:
- 正在折叠转发引用
- EASTL矢量<向量<int>>连续的
- 将函数参数完美转发到函数指针:按值传递呢?
- 转发变量参数列表以模拟 std::thread
- 在按值调用 (c++) 中转发构造函数参数
- 存储稍后要转发的变量参数
- 如何在 C++ 中转发声明 std::set?
- C++使用默认模板参数键入别名和转发声明
- CNTK:->转发或 ->评估某些电脑上的崩溃,而不是其他电脑上的崩溃
- C++20理念:要求表达和完美转发
- 如何在模板中转发右值和左值引用
- 如何转发声明枚举?
- 使用函数指针转发声明作为 lamba 声明
- CAFFE转发网络在for循环中不起作用
- 如何将迭代器调用转发给类的私有成员?
- 转发复制的 std::tuple
- 完美的转发和构造函数
- 是否可以在不扣除的情况下将模板参数转发到 make_*?
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- 如何将枚举类转发声明为模板化类的内部类?