考虑以下两个片段:
附件A :
template<typename CalcFuncT>
int perform_calc(CalcFuncT&& calcfunc)
{
precalc();
int const calc = calcfunc();
postcalc();
return calc;
}
int main()
{
perform_calc([]{ return 5 * foobar_x() + 3; }); // toFuture
perform_calc([]{ return 5 * foobar_y() - 9; }); // toPast
}
图表B :
template<typename CalcFuncT>
int perform_calc(CalcFuncT&& calcfunc)
{
precalc();
int const calc = std::forward<CalcFuncT>(calcfunc)();
postcalc();
return calc;
}
int main()
{
perform_calc([]{ return 5 * foobar_x() + 3; }); // toFuture
perform_calc([]{ return 5 * foobar_y() - 9; }); // toPast
}
DIFF :
precalc();
- int const calc = calcfunc();
+ int const calc = std::forward<CalcFuncT>(calcfunc)();
postcalc();
这两段代码的生成代码之间有什么区别(如果有的话)?
换句话说,std :: forward在上面有什么影响,如果有的话?
注意这个问题并不是要问std :: forward一般来说是什么 - 只是在上面的上下文中它做了什么?
答案 0 :(得分:4)
forward
在将lambda对象调用operator()()之前将其转换为xvalue。 lambda对象的operator()()在“&amp;&amp;”上没有限定或超载所以forward
应该没有影响。