C++ 变量模板函数是否按相反顺序调用lambda参数?

C++ 变量模板函数是否按相反顺序调用lambda参数?,c++,lambda,language-lawyer,variadic-functions,C++,Lambda,Language Lawyer,Variadic Functions,下面打印的是21,而不是12。为什么? #include <iostream> template<class... F> void callMany(F... fib){ [&](...){}( (fib(),123)... ); } int main() { auto f1=[&](){std::cout<<"1";}; auto f2=[&](){std::cout<<"

下面打印的是
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);
}
#包括
模板void callMany(F…fib){
[&](...){}(
(fib(),123)。。。
);
}
int main()
{

auto f1=[&](){std::cout当对包含包扩展的表达式求值时,首先对包进行扩展---可以说,它只是实例化代码,而不执行任何求值---然后根据通常的规则对结果表达式求值。您的表达式

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

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

由于函数参数是按未指定的顺序求值的,因此不能依赖于在
f1
之前调用
f2
,反之亦然。

当对包含包扩展的表达式求值时,首先扩展包,也就是说,只实例化代码而不执行任何求值,然后结果表达式将根据常规规则求值。您的表达式

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

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

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

@cppneyer是的,有,但我不能在注释中解释它。您应该发布一个新问题。@cppneyer是的,有,但我不能在注释中解释它。您应该发布一个新问题在…上