variadic模板函数是否以相反的顺序调用lambda参数?

时间:2017-12-10 03:53:23

标签: c++ lambda language-lawyer variadic-functions

以下demo打印21而不是12。为什么呢?

#include <iostream>
template<class... F> void callMany(F... fib){
    [&](...){}(
        (fib(),123)... 
    );
}
int main()
{
    auto f1=[&](){std::cout<<"1";};
    auto f2=[&](){std::cout<<"2";};
    callMany(f1,f2);
}

我用vc ++和g ++测试了它。两个结果都是一样的。

这是标准行为吗?如果是这样,哪个规则,以及为什么? 它取决于编译器吗?

a way来反转它,但我认为它有点无关。

1 个答案:

答案 0 :(得分:3)

当评估包含包扩展的表达式时,首先扩展包 - 它只是实例化代码,可以这么说而不执行任何评估 - 然后根据通常的规则评估结果表达式。你的表达

[&](...){}(
    (fib(),123)... 
);

扩展为

[&](...){}(
    (f1(),123), (f2(),123)
);

由于函数参数是以未指定的顺序计算的,因此您不能依赖f2之前调用f1反之亦然。