2012-07-25 183 views
2
#include <iostream> 

using namespace std; 
int main(void) 
{ 
    int num[5]; 
    const int* &ref = num; 

    return 0; 
} 

我閱讀過的提到如果參考變量被引用到一個C++書:參考指針類型

  1. 可變其中類型是不同的,但可以被轉換。
  2. 一個不是左值的變量。

只要引用變量聲明爲const,上述兩種情況將通過使用一種方法,其中所述編譯器將創建的存儲和值將被放置到它,而要解決的引用變量的標識符被視爲該特定存儲位置的標識符。以下是演示代碼。

案例1
#include <iostream> 

using namespace std; 
int main(void) 
{ 
    int num = 5; 
    const long long &ref = num; //the value 5 is place in a new storage where ref is the identifier 

    return 0; 
} 
案例2:
#include <iostream> 

using namespace std; 
int main(void) 
{ 
    int num = 5; 
    const int &ref = num + 1; //expression num + 1 evaluated and store in new storage with identifier ref 

    return 0; 
} 

由於這2箱子是有效的,怎麼裏面的情況來驗證碼:是無效的?

我的邏輯是,因爲數組名稱在使用時將被轉換爲指向數組的第一個元素的指針,因此編譯器應該已經發現這不是左值,並且將創建一個新的存儲來存儲地址,當然,引用變量名稱將被視爲該位置的標識符。

注意:我知道這是略微脫離主題,但我可以知道是否數組名稱是左值還是不是?只是一個簡單的是或否會做,因爲將代碼更改爲int &ref = num我認爲它不是一個左值,但我只需要進一步確認。

謝謝。

+1

請您在發佈另一個問題之前**請參閱我的編輯。你應該學會使用降價編輯器。幾乎沒有必要回頭在你的帖子中使用HTML。瞭解降價和請停止發佈** ** brtual HTML這樣的:'                                          ' – meagar 2012-07-27 15:52:35

+1

並請停止使用 「守則」 和「問題」標題。我們可以知道哪些部分是代碼,哪些部分是問題。我們依靠你的文章中的標記和語言來弄清楚你在問什麼,亂七八糟的標題亂七八糟。 – meagar 2012-07-27 15:59:54

回答

4

你參考變量是而不是聲明爲const。

const int *int * const之間的差異,你選擇了錯誤的。

你的榜樣(II)是無效出於同樣的原因,應該是const int &ref = num + 1;

爲了您的注意,我不知道一個簡單的是或否會做。一個簡單的數組名一個左值,指數組。但是,在大多數情況下,它會衰減到一個指向第一個元素的指針,它是一個右值指針。

+0

對不起,輸入錯誤,我剛剛編輯案例我和案例我const – caramel1995 2012-07-25 07:36:43

+0

在閱讀你的答案後,我想我找到了解決方案和我犯的錯誤。 const int *和int * const實際上是彼此不同的。 – caramel1995 2012-07-25 07:42:42