phoenix::lambda 函数的执行顺序是什么?

What's the execution sequence of phoenix::lambda function?

本文关键字:顺序 是什么 执行 lambda 函数 phoenix      更新时间:2023-10-16

我是boost phoenix的新手,我写了一小段代码,但它完全混淆了我的执行顺序,你可以检查代码

std::vector<int> v;
v.push_back(1);
ph::for_each(v,
             ph::lambda[ph::ref(cout)<<"a",
                        ph::ref(cout)<<"b"
                 ])(v);

ph::for_each(arg1,
             ph::lambda[ph::ref(cout)<<"a",
                        ph::for_each(v,
                                         ph::lambda[ph::ref(cout)<<"b",
                                                    ph::ref(cout)<<"c"
                                             ]),
                        ph::ref(cout)<<"d"
                 ])(v);

第一个输出是"ab"但第二个输出是"dbca"

我犯了什么错误吗?

问题是第二个ph::for_each,如果我用我自己的版本for_each替换它,它从左到右工作。我将自己的版本与官方版本进行了比较,不同之处在于它使用了detail::begin和detail:。但真正的问题是什么,我会继续深入调查。

它认为这可以在未定义的顺序下解释,在该顺序中计算一般函数参数。phoenix Lambda语法可能简化为某种形式的函数调用。

标准没有提到这必须是哪个顺序,所以编译器实现者可以随心所欲。不能依赖函数参数的求值顺序。