2017-02-22 95 views
4
void f(int & i){ 
    cout << "l-value-ref" << endl; 
} 

void f(int && i){ 
    cout << "r-value-ref" << endl; 
} 

假設上面的代碼,我們有一個重載函數,它分別採用l值參考和r值參考參數。l值參考和r值參考的結合誤差

int x = 5; 
f(x); 
f(5); 
const int j = 9; 
f(j); 

當我使用const int的J = 9編譯器給模糊誤差。我怎麼解決這個問題?

+0

將第一個'f()'改爲'const int&i'參數。 –

+0

我很驚訝你的編譯器給你這個錯誤。我給了我「綁定const int到類型int和拋棄限定符的引用」。 – SingerOfTheFall

+3

如果它給出*歧義*錯誤,那麼我認爲這個錯誤是**誤導**,因爲它們都不能用'int const'類型的參數'j'調用。編譯器應該給*「沒有找到接受'int const&'」*的函數。 – Nawaz

回答

6

您的編譯器錯誤(如果確實是您提到的錯誤)是誤導性的。這裏真正錯誤的是試圖將const int參數傳遞給您的任何函數將丟棄const限定符,這是不允許的。您可以通過將簽名更改爲const int&/const int&&(請注意const int&&仍然不能與const int參數一起使用),或者通過爲const參數添加另一個過載來解決此問題,具體取決於您想要達到的目標。

基本上,你必須做出的選擇是在「我需要一個需要能夠修改傳遞的引用的版本」(然後是2個版本)和「我永遠不會修改傳遞的引用」(只是const int&版本)。