以下演示打印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 进行了测试。两个结果都是相同的。
是标准行为吗?如果是这样,哪些规则,为什么?
这取决于编译器吗?
有一种扭转它的方法,但我认为它有点无关。
当评估包含包装扩展的表达式时,首先扩展了包装------------可以说,可以说,可以说,而无需执行任何评估表达式根据通常的规则进行评估。您的表情
[&](...){}(
(fib(),123)...
);
扩展到
[&](...){}(
(f1(),123), (f2(),123)
);
并且由于函数参数是按未指定顺序评估的,因此您不能依靠f2
在f1
之前被调用,反之亦然。