2

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

我犯了什么错误吗?

4

2 回答 2

0

它认为这可以在评估一般函数参数的未定义顺序下解释。phoenixLambda 语法可能会简化为某种形式的函数调用。

标准没有提到这必须是什么顺序,因此编译器实现者可以自由地做他们想做的事。您不能依赖函数参数评估顺序。

于 2012-01-15T16:08:16.923 回答
0

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

于 2012-01-15T15:35:56.643 回答