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
建設c1
的operator()
運行後,直到因而最終值是11
)
他們可能沒有這清晰。如果一個錯誤發生在任何接近該例程的地方,我會感到不得不通過挖掘'change'來驗證這個行爲確實是很好的定義。但是對於一個新的變量,在進入'do_it'時沒有'i'處於無效狀態的風險。 – 2011-05-04 21:20:42