2015-08-15 108 views
-1

的代碼片段是如下C++通過引用功能傳遞

#include <iostream> 
using namespace std; 

int a(int m) 
{ 
    return ++m; 
} 
int b(int &m) 
{ 
    return ++m; 
} 
int c(int &m) 
{ 
    return ++m; 
} 
int main(void) 
{ 
    int p=0,q=0,r=0; 
    p+=a(b(p)); 
    q+=b(a(q)); 
    r+=a(c(r)); 
    cout<<p<<q<<r; 
    return 0; 
} 

從Q + = B型「INT」的右值中發生的類型的非const引用無效初始化「INT &」錯誤(一(q))。如何去錯誤,使這個程序打印所需的輸出

+1

請相應地格式化您的代碼示例! –

+2

「b」和「c」不一樣嗎? –

+0

你想要的輸出是什麼? – Amit

回答

0

你不能通過引用傳遞一個常量。

要打破你的代碼。

int a(int m){ 
    return ++m; 
} 

這將在

int b(int &m){ 
    return ++m; 
} 

返回一個int(不斷,如5)

那麼你現在在技術上傳遞一個整數(常量)不是變量進入B.你必須將B作爲變量傳入。

嘗試正是你有什麼,但傳遞

int x = a(your_number_here); 
int z = b(x); 

編輯:

int main(void){ 

    int p=0,q=0; 
    int x = 5; 

    p = a(x); 
    q = b(p); 

    cout << q << endl; 
    return 0; 
} 

返回7.

+0

這裏沒有「常量」。不知道你爲什麼這麼認爲。 –

+0

@LightnessRacesinOrbit絕對有常量...不僅你不正確,但我的上面的帖子解決了他的問題。 他返回的左值不是左值。 –

+0

給我看一個常數。你沒有提到的初始值「0」和「5」不計算在內。 –

0

的錯誤是試圖調用一個函數,它有一個值的參考結果。這就像打電話b的值爲b(1)。這不能工作...

+0

其實這是給喬治·薩默斯技術多選題書和回答的一個問題是322 – soul

+0

@soul:你爲什麼要重複上每一個答案同樣對此有何評論?我們懂了。你從書中得到了這個。但是,這本書是錯誤的。 –

+0

'b(1)'不是「文字」。 –

0

函數調用是你通過引用傳遞。見下:

void foo (int* m) 
{ 
    (*m)++; 
} 

int main (void) 
{ 
    int a = 0; 
    foo (&a); 
    cout << a << endl; // prints 1 
} 
+0

@WhozCraig固定 – bpgeck

+0

其實這是喬治·薩默斯技術多選題書的問題,給出的答案是322 – soul

+0

-1:這答案是錯的。這段代碼傳遞一個指針(和'a'的地址)。 OP通過引用傳遞。 'Type&'和'&expression'是兩個不同的東西。 –

1

蒂莫西·威廉姆斯Ĵ是一個或兩個以下的事情:

  • 錯誤;
  • 教學C++,因爲它涉及到僅Visual Studio中,沒有發表免責聲明它,這是不明智的。

引用不能綁定到臨時對象。它在C++中是不允許的。 Visual Studio允許它作爲非標準的擴展,但就是這樣。有些人會感到困惑,並認爲這意味着它是有效的C++。不是。

您必須將函數調用的結果(如b(1))存儲到命名變量中,然後才能通過引用將它們傳遞到任何位置。

int main() 
{ 
    int p = 0, q = 0, r = 0; 

    int result_of_b_p = b(p); 
    p += a(result_of_b_p); 

    int result_of_a_q = a(q); 
    q += b(result_of_a_q); 

    int result_of_c_r = c(r); 
    r += a(result_of_c_r); 

    std::cout << p << q << r << '\n'; 
} 

我也應該注意到,所引用的代碼很混亂,似乎並沒有比做作「測試您的知識」挑戰其他目的。我不會太在意這點,而是從a proper book學習C++。畢竟,蒂莫西威廉姆斯聲稱上述計劃產出322; it doesn't

0

所以這裏b(int& m)引用一個整數。這樣想一想。引用是編譯器自動處理解引用操作的「安全指針」。

a(int m)返回值是一個臨時的,即,它是,一旦超出範圍作爲函數返回,並將其值以某種方式被利用的臨時值。所以你可以做x = a(15);和x將成爲返回16的副本。這是一個r值。一種「臨時」(因爲它在表達式的右側)。所以當你有一個指向臨時值的指針時,在大多數情況下它是沒有意義的。例如在下面的代碼

int* return_local() { 
    int a = 10; 
    return &a; 
} 

這會給你一個編譯器警告。因爲您不想將指針綁定到超出範圍的值。同樣,你不想引用一個函數返回並且它的值已經被使用的對象。這就是爲什麼你的代碼有錯誤。 a(int m)返回一個r值,當你做b(a(q)您要參考綁定到一個R值

現在有一種叫做R值的基準而採取的形式void some_func(int&& rvalue_reference)語法。 &&表示不參考參考的r值參考。如果你有興趣,可以查看它。

0

它不允許通過一個r值作爲一個非const引用參數。這發生在你用(q)作爲它的參數調用函數b的行中,這是一個r值(一個不是簡單變量的表達式)。 所以,你需要首先調用和itsvalue存儲在變量中,然後將此變量傳遞給B:

int main(void) 
{ 
    int p=0,q=0,r=0; 
    p+=a(b(p)); 
    int t=a(q); 
    q+=b(t); 
    r+=a(c(r)); 
    cout<<p<<q<<r; 
    return 0; 
}