Рассмотрим следующие два фрагмента:
Приложение 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 - только то, что он делает в указанном контексте?