2011-06-09 109 views
5

我有一個函數,當我嘗試編譯它時,給出了錯誤「無法從'int'轉換爲'int &''」。C++中的參考函數

int& preinc(int& x) { 
    return x++; 
} 

如果我用x替換x ++,它會編譯,但我不確定它是如何使它有任何不同。我認爲x ++在x遞增之前返回x,所以不應該將「return x ++」與preinc返回的「return x」相同?如果問題出在++操作符上,那麼爲什麼如果我在return語句之前或之後放置「x ++」行,或者用++ ++替換x ++,它會不會產生任何錯誤?

+2

我會稱之爲「postinc」而不是「preinc」.... – 2011-06-09 11:07:05

+1

謝謝大家誰回答了這個問題。我沒有意識到x ++做了一個臨時副本。現在有道理。 – 2011-06-09 11:15:41

+0

您需要接受以下答案之一。 – 2011-06-28 11:50:48

回答

11

x++創建原件的臨時副本,增加原件,然後返回臨時值。

因爲你的函數返回一個引用,所以你試圖返回一個對臨時副本的引用,這對本函數是本地的,因此無效。

11

你的功能做了兩兩件事:

  • 遞增您在由參考
  • 通過x返回表達x++

到參考的當地結果的參考一個本地是無效的,根據這個函數返回任何東西似乎都是多餘的。

以下是固定的,但我仍然認爲有一個更好的方法:它遞增

int preinc(int& x) { 
    return x++; // return by value 
} 
4

是,x++返回x前。因此它必須返回一個副本,該副本是一個臨時的,並且只能將臨時對象作爲常量引用傳遞。

++x另一方面返回原始x(雖然增加),因此它將與您的函數一起使用。