簡體   English   中英

通過引用傳遞:參數6從'int'到'int&'沒有已知的轉換

[英]pass by reference : no known conversion for argument 6 from 'int' to 'int&'

我有一個函數,我通過引用傳遞參數,因為我希望函數編輯它。 在幾個地方調用此函數,我只關心在特定實例調用時的ref值。 偽代碼:

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,並且有一個long int到int轉換錯誤。

為什么這是錯的? 在這里實現預期結果的最佳方法是什么?

一個常規的int&意味着它需要已經分配給一個變量; 它需要是一個lvalue

0未分配給變量; 它是一個“自由變量”,這意味着它與標簽無關。 這意味着它是一個rvalue ,一個未綁定到變量的臨時變量。 它由int&&表示。

如果你使它成為const int&則可以將rvalue轉換為lvalue 有意義的是,常量可以轉換為reference to int constantreference to int constant (從右到左閱讀)。

但是,這將是毫無意義的,因為你想修改變量; 因此,答案是遵循自己的約定,不要傳遞那些尚未存在的東西並綁定到標簽/名稱,如常量或移動變量。

考慮這個更簡單的例子:

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

這實際上是嘗試將0設置為3.即:

int main() {
    0 = 3;
}

但那是胡說八道。 int & (而不是const int& )只能接受可修改的東西。

(正如@ n​​ogeek001指出的那樣, const int&並且不允許我們修改ref。)

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

至於解決你的問題,你應該使用指針來實現它,然后檢查指針是否設置為0, NULL或者你是否使用C ++ 11, nullptr

正如其他人所說,你不能傳遞文字作為參考。

你可以做的是傳遞一個地址,然后檢查函數中是否為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)

ref是引用而不是指針。 如果是,則可以傳遞0,表示指向null的指針; 引用不能指向任何內容,必須綁定到左值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM