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

时间:2012-01-14 15:23:55

标签: c++ lambda boost-phoenix

我是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”

我犯了一些错误吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

它认为这可以在 undefined order 中解释,其中评估了一般函数参数。 phoenix Lambda语法可能会减少某种形式的函数调用。

标准没有提到这必须是哪个顺序,因此编译器实现者可以随意做。您不能依赖函数参数评估顺序。