std :: rvalue的前锋参考lambda?

时间:2012-03-28 23:16:13

标签: c++ lambda c++11 forwarding rvalue-reference

考虑以下两个片段:

附件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 个答案:

答案 0 :(得分:4)

forward在将lambda对象调用operator()()之前将其转换为xvalue。 lambda对象的operator()()在“&amp;&amp;”上没有限定或超载所以forward应该没有影响。