Какова последовательность выполнения функции phoenix :: lambda? - PullRequest
2 голосов
/ 14 января 2012

Я новичок в 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 голосов
/ 15 января 2012

Кажется, это можно объяснить в неопределенном порядке , в котором оцениваются аргументы общей функции.Синтаксис phoenix Lambda, вероятно, сводится к некоторой форме вызовов функций.

Стандарт не указывает, в каком порядке это должно быть, и поэтому разработчики компилятора могут делать все, что пожелают.Вы не можете полагаться на порядок вычисления аргументов функции.

0 голосов
/ 15 января 2012

Проблема в том, что второй ph :: for_each, если я заменю его собственной версией for_each, он будет работать слева направо. Я сравниваю свою собственную версию с официальной, разница в том, что она использует detail :: begin и detail :: end. Но что является настоящей проблемой, я продолжу исследовать ее подробнее.

...