注意:我使用的是g ++編譯器(這是我聽說的非常好,應該是非常接近標準)。當聲明對Ints數組的引用時,爲什麼它必須是對const指針的引用?
比方說,你已經宣佈的int數組:
int a[3] = { 4, 5, 6 };
現在讓我們假設你真的要聲明該數組(請不要介意,爲什麼,除了Bjarne的基準說,語言支持的話)。
案例1 - 如果你嘗試:
int*& ra = a;
則編譯梁木,並說:
"invalid initialization of non-const reference of type `int*&' from a temporary of type `int*'"
首先第一件事情,爲什麼是 '一個' 臨時變量(即不它在內存中的地方嗎?)......
反正精細,每當我看到一個非const的錯誤,我嘗試在一個const扔...
案例2 - 如果你嘗試:
int*const&rca = a; //wish I knew where the spaces should go (but my other post asking about this sort of protocol got a negative rank while many of the answers got ranked highly -- aha! there are stupid questions!)
然後一切都很酷,它編譯,你會得到的數組的引用。
案例3 - 現在,這裏是另一回事,這將編譯:
int* justSomeIntPointer = a; //LINE 1
int*& rpa = justSomeIntPointer; //LINE 2
這也給了你原來的數組的引用。
所以這裏是我的問題:什麼時候靜態聲明的數組 的名稱成爲常量指針?我似乎記得一個int數組的名字也是一個int指針,但我不記得它曾經是一個const指針int ...
看起來好像情況1因爲聲明的參考(ra)不是const指針,這可能意味着'a'已經是一個const-pointer-to-int開頭。
似乎情況2的工作原理是因爲聲明的引用(rca)已經是一個const-pointer-to-int。
案例3也有效,它很整潔,但爲什麼?假定的指針指向int(即數組名稱'a')在什麼時候成爲一個常量指針?將它分配給int *(LINE 1)時會發生嗎?或者當您將該int *分配給int * &(LINE 2)時它會發生嗎?
希望這是有道理的。謝謝。
所以被臨時變量總是const的? – Jimmy
@Jimmy:臨時表達式並不總是const,但是語言禁止直接綁定到非const引用。數組'a'不是一個臨時的,但它是由數組到指針的轉換產生的指針,這是一個臨時的。 –
在堆棧中聲明意味着'具有自動存儲持續時間',即當其包含的塊/對象確實不在「臨時」時超出範圍。很少有人考慮必須手動管理動態分配的對象才能成爲加分點。我們需要的最後一件事是關於爲什麼動態分配更好的另一個錯誤想法。這一點尤其糟糕,因爲它引發了_temporary_的錯誤定義,這個術語具有非常明確的,不同的含義。 –