我遇到了这个签名的功能。
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
答案 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的)。