通过引用传递数组参数

时间:2011-10-26 12:16:43

标签: c++ arrays pass-by-reference

我遇到了这个签名的功能。

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

这是通过引用传递固定大小的char数组的语法。

它需要围绕&x括号的事实让我觉得不寻常。

它可能是C ++ 03标准的一部分。

这个表格叫做什么,有人可以指出对标准的引用吗?

c ++ decl还不是朋友:

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

3 个答案:

答案 0 :(得分: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](第二种情况)。

答案 1 :(得分:11)

语法没什么异常或新的。你在C中用指针一直看到它。 []的优先级高于&,因此如果要声明对数组的引用,则需要将其放在括号中。同样的事情发生在*(与&具有相同的优先级):例如,要在C中声明指向5个字符的数组的指针,您将执行char (*x)[5];。类似地,指向获取并返回int的函数的指针将是int (*x)(int);()具有与[]相同的优先级。故事与引用相同,只是引用仅在C ++上,并且对引用的类型有一些限制。

答案 2 :(得分: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 ++编译器报告:

  

错误:将'x'声明为引用数组

顺便说一下,here是指向cdecl服务的在线工具的链接(尽管它抱怨引用,因为该网站托管的版本是特定于C的)。