【问题标题】:Does variadic template function call lambda parameter in reverse order?variadic模板函数是否以相反的顺序调用lambda参数?
【发布时间】:2017-12-10 03:53:22
【问题描述】:

下面的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可以反转,不过我觉得有点无关。

【问题讨论】:

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


    【解决方案1】:

    当一个包含包展开的表达式被求值时,包首先被展开——这只是简单地实例化代码,可以说,不执行任何求值——然后根据通常的规则对结果表达式进行求值.你的表情

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

    展开成

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

    并且由于函数参数以未指定的顺序进行评估,因此您不能依赖在 f1 之前调用 f2反之亦然。

    【讨论】:

    • @cppBeginner 是的,有,但我无法在评论中解释。您应该发布一个新问题。
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多