std :: forward rvalue ref для лямбды? - PullRequest
4 голосов
/ 29 марта 2012

Рассмотрим следующие два фрагмента:

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

1 Ответ

4 голосов
/ 29 марта 2012

forward преобразует лямбда-объект в xvalue перед вызовом оператора () () для него. Оператор лямбда-объекта () () не квалифицирован или перегружен на «&&», поэтому forward не должно иметь никакого влияния.

...