2011-10-26 146 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-特定的)的链接。