2

私はブーストフェニックスの初心者です。小さなコードを書きましたが、実行シーケンスについて完全に混乱しています。コードを確認できます

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」ですが、2 番目の出力は「dbca」です。

私は何か間違いをしましたか?

4

2 に答える 2

0

問題は 2 番目の ph::for_each です。これを自分のバージョンの for_each に置き換えると、左から右に動作します。自分のバージョンと公式バージョンを比較します。違いは、 detail::begin と detail::end を使用していることです。しかし、本当の問題は何ですか、私はそれをさらに調査し続けます.

于 2012-01-15T15:35:56.643 に答える
0

これは、一般的な関数の引数が評価される未定義の順序で説明できると考えています。Lambda 構文は、phoenixおそらく何らかの形式の関数呼び出しに縮小されます。

標準は、これがどの順序でなければならないかについて言及していないため、コンパイラの実装者は自由に好きなようにできます。関数の引数の評価順序に依存することはできません。

于 2012-01-15T16:08:16.923 に答える