variadic模板函数会以相反的顺序调用lambda参数



以下演示打印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)
);

并且由于函数参数是按未指定顺序评估的,因此您不能依靠f2f1之前被调用,反之亦然。

相关内容

  • 没有找到相关文章

最新更新