2012-01-14 12 views
2

私はブースト鳳凰のための初心者だけど、私は小さなコードを書きましたが、それは完全に実行シーケンスについて私を混乱させる、あなたはコードphoenix :: lambda関数の実行順序は何ですか?

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"

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

答えて

0

問題は2番目のph :: for_eachです。自分のバージョンのfor_eachに置き換えると、左から右に動作します。 私は自分のバージョンを公式のものと比較しますが、違いは使用するディテール:: beginとdetail :: endです。 しかし、実際の問題は何ですか、私はもっと調査を続けます。

+0

いいえ、私は間違いをしますが、違いは戻り値の型です、公式のものは戻り値Fです、私自身のものは無効です、おそらくこれは問題です。 –

0

一般的な関数の引数が評価される未定義のので説明できると思います。 phoenixラムダ構文は、おそらく何らかの形の関数呼び出しに還元されます。

スタンダードには、これがどんな順番であるかは言及されていないので、コンパイラの作成者は自由に行うことができます。関数の引数の評価順序に依存することはできません。

+0

お返事ありがとうございます。あなたはlambdaのコードが未定義の順序で実行されていることを意味します。継ぎ目は1つのラムダ関数に1行だけ書く方が良いです。しかし、phoenixのオンラインドキュメントによれば、1つのラムダ関数に複数の行を書くことができます。もし順序が定義されていなければ、複数の行を書き込むことはほとんど役に立たないと思います。しかし、if_ then_stateはどういう意味ですか、これらの命令の順序は何ですか、私は後でそれを試してみます。ありがとう –