2015-07-21 56 views
2

我有一個函數,我通過引用傳遞了一個參數,因爲我期望函數編輯它。這個函數在幾個地方被調用,我只關心在特定實例中調用時的ref值。 僞代碼:通過引用傳遞:從'int'到'int'的參數6沒有已知的轉換

test_fn(int a, int b, inc , int d, int e, int& ref) 
{ 
//bunch of other functionalities 
//. 
//. 
ref = (a*b+c)*(d+e); 
} 

test_fn(1,2,3,4,5,0)//everywhere that I do not care about ref 
int value = 0; 
test_fn(1,2,3,4,5, value)//I care about value here and would use it in the remainder of the code . 

我爲什麼不能直接傳遞一個0?我試着傳遞一個NULL,並且有一個int int轉換錯誤。

爲什麼這是錯的?在此實現預期結果的最佳方式是什麼?

+0

如果您正在尋找傳遞NULL作爲一個選項,你看着使用指針在引用? http://stackoverflow.com/a/57492/1658810 –

回答

2

爲了通過引用傳遞它必須存在的變量,通過0或NULL意味着你發送一個常量。你不能編輯一個常量的值,因爲它實際上不是一個變量。

作爲解決您的問題,您應該probaby使用指針來實現這一點,那麼檢查指針設置爲0,NULL或者如果您使用C++ 11,nullptr

3

定期int&意味着它需要被分配給一個變量已經;它需要是一個lvalue

0未分配給變量;它是一個「自由變量」,這意味着它不依賴於標籤。這意味着它是一個rvalue,一個不綁定到變量的臨時變量。它表示爲int&&

rvalue s可以轉換爲lvalue s如果你使它const int&。它是有道理的,一個常數可以轉換爲reference to int constant(從右向左讀)。

但是,那會毫無意義,因爲你想修改的變量;因此,答案是按照你自己的慣例,不要傳入那些還沒有存在於「存在」中的東西,並且必須與標籤/名稱綁定,比如常量或移動的變量。

3

考慮這個非常簡單的例子:

test_fn(int& ref) 
{ 
    ref = 3; 
} 
int main() { 
    test_fn(0); 
} 

這是有效地嘗試設置爲0〜3即:

int main() { 
    0 = 3; 
} 

但是,這是無稽之談。 int &(而不是const int&)只能接受可修改的內容。

(如@ nogeek001指出,const int&不會讓我們無論如何修改參考)

+0

這很有道理!謝謝!! – nogeek001

+1

(與const int&相對)?使用const int&但不會讓該函數修改ref值 - 正確嗎? – nogeek001

0

裁判是引用不是指針。如果是0,則可以傳遞0,表示指向null的指針;引用不能指向任何東西,並且必須綁定到左值。

1

正如其他人所說,你不能傳遞一個字面作爲參考。

你可以做的是傳遞一個地址,然後檢查是否爲NULL函數中:

test_fn(int a, int b, inc , int d, int e, int* ref) 
{ 
    int someValue = (a*b+c)*(d+e); 
    if (ref) 
     *ref = someValue; 
} 
//... 
test_fn(1,2,3,4,5,0); 
int value = 0; 
test_fn(1,2,3,4,5, &value) 
相關問題