2015-06-22 42 views
2

我很清楚const pointer to pointer problem,我想我知道發生了什麼,但是我錯了。我想實現這一點:在C++中使用Consts的數組指針和引用

int* var[4]; 
const int* const (&refArray)[4] = var;  //compile error 

是的,我想保留,而不是轉換爲指針數組,是的,我確實在我的代碼遇到了這個問題。於是我就在調查什麼我能做和不能做的,用不了多久我意識到我不知道這是怎麼回事:

int* var[4]; 

const int* const * ptr = var;      //allowed 
const int* const * (&refPtr_indirect) = ptr;  //allowed 

const int* const * (&refPtr) = var;    //error 

const int* const * const (&constRefPtr) = var; //allowed 

int* const (&refArray)[4] = var;     //allowed 

const int* const (&refArray)[4] = var;   //error 

我可以理解第4名,但最後兩使得完全沒有意義的我。我確實看到第三個版本可能工作,我可以放棄reference,但我真的希望保留數組類型。

任何幫助表示讚賞,但希望它可以包括背後的推理爲什麼規則是這樣。

+3

任何好的理由,不只是用'的std :: array'或'提振:: array'? –

+0

無論如何,你應該從一個指向數組'&var'的指針進行初始化。這也行不通,但可能更容易找出原因。 – juanchopanza

回答

1

您有一個指向(非常量)int的四個指針的數組。要把它當作一個指向const int的四個指針的數組,你需要做一個類型雙關語。 int [4]const int [4]的類型是不同的,對一個的引用不能引用另一個。

你可以做的最好的方法是對整個數組進行一個常量引用。在這樣複雜的情況下,最好使用某種類型的名稱可管理性:

typedef int* TheArray[4]; 
TheArray var; 
const TheArray &ref = var; 

這給了你這樣的:

ref[0]; // OK 
ref[0] = nullptr; // error 
*ref[0]; // OK 
*ref[0] = 42; // OK 

你的第五個版本是一樣的,只是沒有類型名稱

int * const (&refArray) [4] = var; 

對指向int的四個指針的恆定陣列的引用。 (一個常量數組與常量元素數組相同)。

第六個版本不可能工作,正如我在頂部—所說的那樣,數組元素的類型是不同的,所以沒有引用可以同時指向它們。

+0

Thx,這確實有很大的幫助。然而,這會產生一個「const」的問題嗎? –

+0

@PasserBy不是沒有類型雙關語(這是一般未定義的行爲)。這就是爲什麼我說「你能做到最好......」 – Angew

0

Angew得到了一些分,但我認爲問題在於:

您不能轉換int*[n]const int*[n]

所以這是允許的:

int a[4]; 
const int (&b)[4] = a; 

但下面是不是:

int *c[4]; 
const int *(&d)[4] = c;