2012-01-14 34 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」 但第二個輸出是「dbca」

我犯了一些錯誤嗎?

回答

0

問題是第二個ph :: for_each,如果我用我自己的版本for_each替換它,它從左到右工作。 我比較自己的版本和官方版本,區別在於它使用了詳細信息:: begin和detail :: end。 但是真正的問題是什麼,我會繼續調查它。

+0

不,我犯了一個錯誤,區別是返回類型,官方是返回F,我自己的一個是無效的,也許這是問題。 – 2012-01-15 15:58:54

0

它認爲這可以在未定義的訂單下解釋,其中評估了一般函數參數。 phoenix Lambda語法可能會減少爲某種形式的函數調用。

該標準沒有提到這是必須的順序,所以編譯器實現者可以隨心所欲地做。您不能依賴函數參數評估順序。

+0

感謝您的答覆。您的意思是lambda中的代碼是在未定義的順序下執行,接縫最好在一個lambda函數中只寫一行。但根據鳳凰在線文檔,你可以在一個lambda函數中寫多條線,如果訂單沒有定義,我認爲寫多條線幾乎沒有用。但是,如果這麼說,那麼這些陳述中的順序是什麼,我會稍後再嘗試。謝謝 – 2012-01-16 02:46:11