2011-05-04 49 views
2

考慮這個例子(這是一個例子的文件中有關更新回滾一個簡單化爲boost::multi_index_container): 參數評估和不確定的行爲

#include <iostream> 

struct change 
{ 
     int val_; 
     change(int const &val) : val_(val) 
     { 
     } 

     void operator() (int &v) const 
     { 
       v = val_; 
     } 
}; 

void do_it(int &v, change const &c1, change const &c2) 
{ 
     c1(v); 
     c2(v); 
} 

main() 
{ 
     int i = 17; 
     int orig = i; 
     do_it(i, change(11), change(orig)); 
     std::cout << "i = " << i << std::endl; 
} 

這裏需要

i明確的副本(進入 orig)?或者,這可以更簡單地寫爲:

 int i = 17; 
     do_it(i, change(11), change(i)); 

在這種情況下,是i調用do_it仍保證爲17後的價值? change這兩個參數都需要在函數主體執行之前構建。

語言是否保證在函數開始之前構造所有參數? (如果沒有保證,那麼編譯器可能會推遲的c2建設c1operator()運行後,直到因而最終值是11

+0

他們可能沒有這清晰。如果一個錯誤發生在任何接近該例程的地方,我會感到不得不通過挖掘'change'來驗證這個行爲確實是很好的定義。但是對於一個新的變量,在進入'do_it'時沒有'i'處於無效狀態的風險。 – 2011-05-04 21:20:42

回答

4

所有參數的函數調用進行評估之前,作用是調用。未指定參數的評估順序。

在你的情況i仍然是17