2011-04-07 30 views
3
#include <iostream> 

void f(const int * & p) 
{ 
    int i =0; 
    i = p[0]; 
    std::cout << i << std::endl; 
} 

int main() 
{ 
    int * p =new int[1]; 
    p[0] =102; 
    f(p); 
    return 1; 
} 

gcc編譯器爲這個代碼提供錯誤:常量參數問題

prog.cpp: In function ‘int main()’: 
prog.cpp:16: error: invalid initialization of reference of type ‘const int*&’ from expression of type ‘int*’ 
prog.cpp:5: error: in passing argument 1 of ‘void f(const int*&)’ 

但是,如果我改變 「F」 功能爲

void f(const int * const & p) 

一切正常。有人可以解釋爲什麼const會以這種方式表現嗎?謝謝。

+1

嗨。在這種情況下發布您看到的錯誤消息總是有幫助的。請你能這樣做嗎? – razlebe 2011-04-07 15:32:34

+1

http://duramecho.com/ComputerInformation/WhyHowCppConst.html看看這個參考資料,它解釋了爲什麼你會得到這些錯誤 – 2011-04-07 15:33:05

+0

我已經添加了gcc4.3.4產生的錯誤信息 – razlebe 2011-04-07 15:39:05

回答

10

int*const int*需要創建一個臨時的const int*指針並將參考const int*&綁定到該臨時。

標準禁止爲非const引用創建臨時對象。因此,您需要在修復之前製作參考常量。

這是因爲非常量引用意味着「我想更改調用程序使用該引用參數傳遞的參數」。但是,如果調用者需要轉換他們的參數並最終傳遞一個臨時參考,則該參考的目的是爲零,因此標準認爲嘗試並通過臨時參數是錯誤的。

1

如果第一轉換(int *const int * &)被允許,則可以寫出這樣的惡功能:

const int really_const[] = {1,2,3}; 

void evil(const int * & p) 
{ 
    p = really_const; 
} 

int main() 
{ 
    int not_const[3]; 
    int * p = not_const; 
    evil(p); 
    p[0] = 0; // Whoops: modifying a const object 
} 

第二轉換是很好的,因爲它防止了功能從在此修改指針辦法。

+0

除非通過'const int *'定義了轉換,在這種情況下,'p = really_const'會修改一個臨時變量,而不是來自'main'的'p'變量。然後'邪惡'會更好地稱爲'困惑',因爲它會修改一個臨時被破壞的臨時,並且用戶會想知道他們的變化發生在哪裏。 – 2011-04-07 15:44:08