reference陣列 - int array as parameter c++




為什麼引用數組是非法的? (10)

一個數組可以隱式轉換為一個指針,並且指向指針的引用在C ++中是非法的

以下代碼不能編譯。

int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};

C ++標準對此有何評論?

我知道我可以聲明一個包含引用的類,然後創建該類的數組,如下所示。 但我真的想知道為什麼上面的代碼不能編譯。

struct cintref
{
    cintref(const int & ref) : ref(ref) {}
    operator const int &() { return ref; }
private:
    const int & ref;
    void operator=(const cintref &);
};

int main() 
{
  int a=1,b=2,c=3;
  //typedef const int &  cintref;
  cintref arr[] = {a,b,c,8};
}

可以使用struct cintref而不是const int &來模擬引用數組。


一個簡單的原因引用數組不能存在! 引用是編譯時實體。 意思是它們在編譯期間被替換為適當的地址。 現在說你做了數組和引用數組[]。

還有一些在代碼中的數組[2],那就沒問題了。 編譯器只需查看數組中的第三個初始化程序並替換地址即可。

但是現在說你做了數組[我],它將取代什麼? 沒有關於我的信息。

指針的情況是不同的。 它們是具有分配給它們的內存的實際變量,並且如果您執行*指針,則會在運行時解析它們。 因此,如果你有一個指針數組並且做* array [i],它將是有效的,因為在執行期間有關於i的信息。

我希望它能回答這個問題。


參考對像沒有大小。 如果你寫了sizeof(referenceVariable) ,它會給你referenceVariable referenceVariable的對象的大小,而不是引用本身的大小。 它沒有自己的大小,這就是為什麼編譯器無法計算出數組需要多少大小的原因。


只是為了增加所有的談話。 由於數組需要連續的內存位置來存儲項目,所以如果我們創建一個引用數組,那麼不能保證它們將處於連續的內存位置,因此訪問將成為一個問題,因此我們甚至不能將所有的數學運算應用於陣列。


因為像很多人在這裡所說的那樣,引用不是對象。 他們只是別名。 確實,一些編譯器可能將它們實現為指針,但標準並不強制/指定它。 因為引用不是對象,所以你不能指向它們。 在數組中存儲元素意味著有某種索引地址(即指向某個索引處的元素); 這就是為什麼你不能有引用數組,因為你不能指向它們。

改用boost :: reference_wrapper或boost :: tuple; 或者只是指針。


實際上,這是C和C ++語法的混合體。

您應該使用純C數組,因為引用僅是C ++的一部分,所以不能用作引用。 或者你去C ++的方式,並為你的目的使用std::vectorstd::array類。

至於編輯過的部分:儘管struct是C中的一個元素,但您可以定義一個構造函數和運算符函數,這使得它成為一個C ++ class 。 因此,你的struct不會在純C中編譯!


我相信答案非常簡單,它與引用的語義規則以及如何在C ++中處理數組有關。

簡而言之:引用可以被認為是沒有默認構造函數的結構,因此所有相同的規則都適用。

1)在語義上,引用沒有默認值。 引用只能通過引用來創建。 參考文獻沒有表示缺少參考的值。

2)當分配一個大小為X的數組時,程序創建一個默認初始化對象的集合。 由於引用沒有默認值,所以創建這樣的數組在語義上是非法的。

此規則也適用於沒有默認構造函數的結構體/類。 下面的代碼示例不能編譯:

struct Object
{
    Object(int value) { }
};

Object objects[1]; // Error: no appropriate default constructor available

當你在數組中存儲某些東西時,它的大小需要知道(因為數組索引依賴於大小)。 根據C ++標準沒有指定引用是否需要存儲,因為索引數組的引用是不可能的。


考慮一個指針數組。 指針確實是一個地址; 所以當你初始化數組時,你類似地告訴計算機:“分配這塊內存來保存這些X號碼(這是其他項目的地址)。” 那麼如果你改變其中的一個指針,你只是改變它指向的內容; 它仍然是一個數字地址,它本身坐在同一個地方。

引用類似於別名。 如果你要聲明一個引用數組,你基本上會告訴計算機,“分配這個由散佈在周圍的所有這些不同項目組成的內存塊。”






reference