【问题标题】:Passing array arguments by reference通过引用传递数组参数
【发布时间】:2011-12-15 16:33:36
【问题描述】:

我遇到了一个带有这个签名的函数。

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

【问题讨论】:

  • 我无法指向标准,但我相信这是因为char& x[5] 是一个包含 5 个字符引用的数组,而不是对长度为 5 的字符数组的引用。
  • 8.3.2 引用 "不得有对引用的引用,不得有引用数组,也不得有指向引用的指针。"
  • 为这些功能使用标点符号不是一个很好的选择吗?

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


【解决方案1】:

没什么好解释的,这就是 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++,因为您不能拥有引用数组。这只是对声明语法的解释。 (很抱歉花了这么长时间才完成这项工作,感谢提供帮助的 cmets!)

如果您愿意,您可以将类型标识符包装在任意级别的括号中,因此您也可以说char &(x)[5](第一种情况)或char (((&x)))[5](第二种情况)。

【讨论】:

  • 哪个编译器接受第一种形式? gcc 4.4.5 没有:错误:将“x”声明为引用数组
  • 当然,除了第一个不是合法的 C++,因为你不允许有引用数组。
  • 看来你至少需要包裹一层括号。
  • @JamesKanze:不是作为独立声明,而是作为函数参数声明!好点:-)
  • 比较 void (*funcptr)(int) 来声明一个函数指针,而不是一个返回指针的函数。
【解决方案2】:

语法没有什么不寻常或新的。你在 C 语言中经常看到它带有指针。 [] 的优先级高于&,因此如果要声明对数组的引用,则需要将其放在括号中。 *(与 & 具有相同的优先级)也会发生同样的事情:例如,要在 C 中声明一个指向 5 个字符数组的指针,您可以使用 char (*x)[5];。类似地,指向接受并返回 int 的函数的指针将是 int (*x)(int);()[] 具有相同的优先级)。引用的情况与此相同,只是引用仅在 C++ 上,并且对可以从引用形成的类型有一些限制。

【讨论】:

  • +1 用于解释括号的要求。从参考文献中形成类型的限制在哪里记录?
  • @Eddy Pronk:我指的是您在对上述问题的评论中引用的陈述
【解决方案3】:

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 特定的)。

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 2011-08-21
    • 2011-08-09
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多