2014-10-10 74 views
3

香草薩特建議落實後置這樣的:爲什麼按照預增量實現後增量?

T T::operator++(int)() { 
    auto old = *this; // remember our original value 
    ++*this;   // always implement postincr in terms of preincr 
    return old;  // return our original value 
} 

隨着方針:

指南:爲了保持一致性,始終貫徹在預增量方面後增,否則你的用戶將獲得令人驚訝(並且 通常不愉快)的結果。

這些令人驚訝的結果是什麼(而且往往令人不愉快)?

回答

1

這個問題有點哲學。對操作符的語義沒有「絕對明確的」定義,但用戶可能會認爲它們對參數具有相同的效果,但是在效果之前返回參數,在效果之後返回參數。但是,這可以通過所提議的實現輕鬆實現。但是,沒有「不良影響」可以通過偏離方法來保證。

3

這可以確保兩個操作符在它們如何修改對象方面的行爲是等價的,並且只有它們的返回值不同。如果分別實施兩個操作員,並且您決定修改其中一個,則可能會忘記對另一個操作員進行等效更改。如果你用另一個來實現一個,你只需要在一個地方進行修改。而預先增量是最基本的增量是有意義的,因爲後增量的唯一區別是將舊值先臨時保存。

當他說你的用戶會得到令人驚訝的結果時,他可能誇大了事情。他可能應該說可能會得到令人驚訝的結果,因爲它只會發生,如果你搞砸了。

2

我很確定他只是說在preincrement方面實現postincrement消除了你意外地實現了兩個不同邏輯的操作符的可能性,這會給用戶造成很大的困擾。假設你沒有犯這樣的錯誤,沒有什麼令人驚訝或不愉快的事情發生(儘管由於代碼重複,它可能仍然不是最理想的)