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是的,有,但我不能在注释中解释它。您应该发布一个新问题在…上