2011-10-26 182 views
13

我遇到了具有此簽名的函數。通過引用傳遞數組參數

void foo(char (&x)[5]) 
{ 
} 

這是爲了通過引用傳遞一個固定大小的字符數組的語法。

事實上,它需要圍繞&x括號引起我的不尋常。

它可能是C++ 03標準的一部分。

什麼是這種形式調用,任何人都可以指出一個標準的參考?

C++東方電氣是不是朋友尚未:

$ c++decl 
Type `help' or `?' for help 
c++decl> explain void foo(char (&x)[5]) 
syntax error 
+3

我不能指向標準,但我相信這是因爲'char&x [5]'是一個包含5個字符引用的數組,而不是對長度爲5的字符數組的引用。 –

+0

'C++ decl'是你的朋友:-) –

+1

8.3.2參考文獻「應該沒有引用的引用,沒有引用的數組,也沒有引用的指針。」 –

回答

11

沒有什麼不尋常的或新的語法。你用C指針一直在C中看到它。 []的優先級高於&,因此如果要聲明對數組的引用,則需要將其放在括號內。同樣的事情發生在*(與&具有相同的優先級):例如,要聲明一個指向C中5個字符數組的指針,您應該執行char (*x)[5];。類似地,指向一個獲取並返回一個int的函數的指針將爲int (*x)(int);()具有與[]相同的優先級)。這個故事與引用相同,只是引用僅在C++上引用,並且對引用可以形成的類型有一些限制。

+0

+1解釋圓括號的要求。從參考文獻中形成類型的限制有哪些限制? –

+0

@Eddy Pronk:我指的是你在你的評論中對你的問題引用的陳述 – newacct

11

沒有什麼解釋,這簡直是對申報的解析規則是如何用C工作++:

char & x[5] // declare x as array 5 of reference to char (not valid C++!) 
char (&x)[5] // declare x as reference to array 5 of char 

注意:然而,第一個版本不是有效的C++,因爲你不能有引用數組。這僅僅是對聲明語法的解釋。 (對不起了那麼久纔得到這個權利,多虧了有益的意見!)

你允許包裹類型標識符在括號中的任意波形的水平,如果你喜歡,那麼你也可以說char &(x)[5](第一案)或char (((&x)))[5](第二種情況)。

+0

+1:沒錯。) –

+0

哪個編譯器接受第一個表單? gcc 4.4。5不會:錯誤:作爲參考數組的聲明'x' –

+0

當然,除非第一個不是合法的C++,因爲您不允許引用數組。 –

0

c++decl主要爲此工作。對於你給它的東西只是有點挑剔。

c++decl> explain void foo(char (&)[5]) 
declare foo as function (reference to array 5 of char) returning void 

c++decl> explain void foo(char &[5]) 
declare foo as function (array 5 of reference to char) returning void 

正如在另一個答案中指出的,參考數組是非法的。在GNU C++編譯器報告:

error: declaration of ‘x’ as array of references

順便說一句,here是一個在線工具,它提供cdecl(雖然它抱怨引用,因爲由網站主辦的版本是C-特定的)的鏈接。