在C ++中返回数组引用的语法

时间:2015-09-23 06:56:51

标签: c++ arrays function reference declaration

当我遇到这个问题时,我一直在研究C ++中的数组概念:Return an array in c++

有人回答使用此声明:

order by

我无法理解的是在结束括号后的[3]。我从未见过看起来像这样的功能声明。我理解其余的语法,但我并不特别理解[3]是如何工作的,因为它位于函数名之后。如果我忽略了一些简单的事情,我会提前道歉。我也尝试查看函数声明的规范,但我没有看到任何可以链接到下标语法的相关内容。那么,这怎么可能呢?

3 个答案:

答案 0 :(得分:5)

该函数将引用返回到大小为int 3的数组,而[3]部分的函数实际上是数组的大小作为参考返回。

这种模糊的语法来自数组声明的奇怪语法,您可以这样做:

int arr[3]; //real but weird

如果有这样的语言会更简单:

int[3] arr; //hypothetical but better and simpler

因为3的大小arrunsigned int a; 类型的部分,所以如果所有部分都显示在变量名称的左侧,则更有意义和写作时一样:

unsigned a int; //analogous to : int a [3];

你不写:

unsigned int

因此虽然语言使用int[3]做了正确的事情,但int[3]& f(int[3]& arr); //hypothetical 确实很奇怪。

现在回到函数声明,如果声明为:

,函数会好得多
int (&f(int (&arr)[3])[3]; //real

只有当变量名左侧的所有部分都有。但是因为它没有这样做(即语言需要你在变量名后面的最右边写大小),你最终会得到这个奇怪的签名:

typedef int array_type[3];

array_type& f(array_type& arr);

请注意,即使参数变得奇怪。

但你可以使用typedef简化它:

using array_type = int[3];

array_type& f(array_type& arr);

看起来好多了。现在只有 typedef 看起来很奇怪。

使用C ++ 11,您甚至可以编写更好的typedef:

array_type

尽可能接近(如果您将int[3]视为int[3]& f(int[3]& arr); //hypothetical ):

x <- 1:10
y <- 11:20
plot(x, y)
lines(x,y)

希望有所帮助。

答案 1 :(得分:2)

好吧,请阅读创作者Dennis M. Ritchie的关于C历史的article

看起来这个语法我们从B,从C到C ++ ......

我相信,这种方式可以声明某些&#34;基本类型&#34;的几个变量。是这种奇怪语法的根源:

int a, *b, c[3];

所以a只是intb是指向int的指针,cint的数组......

如果这些*[3]是类型定义的一部分而不是变量定义 - 那么我们需要3行来写这个:

int a;
int* b;
int[3] c;

SO C page上有两个很好的资源来学习如何解析这样的结构:

cdecl失败了一点 - 因为引用不是C的一部分 - 所以让我们试试The Clockwise/Spiral Rule for parsing C declarations.

int (&f(int (&arr)[3]))[3]
  1. arr - &gt; arr
  2. &arr - &gt; arr是参考
  3. (&arr) - &gt; arr是引用 - 围绕()并没有真正改变一件事
  4. (&arr)[3] - &gt; arr引用大小为3的数组
  5. int (&arr)[3] - &gt; arr是对int
  6. 类型的大小为3的数组的引用

    下一步:

    1. f - &gt; f
    2. f(int (&arr)[3]) - &gt; f是功能服用arr,这是......
    3. &f(int (&arr)[3]) - &gt; f是函数arr,它是......,并返回引用
    4. (&f(int (&arr)[3]))[3] - &gt; f是函数获取arr,它是...,并返回对大小为3的数组的引用
    5. int (&f(int (&arr)[3]))[3] - &gt; f是函数获取arr,它引用int类型的大小为3的数组,并返回对int类型为3的数组的引用
    6. 当然 - 至少对我来说,这段代码应该更容易阅读:

      using int3 = int[3];
      int3& f(int3& arr);
      

答案 2 :(得分:1)

int (&f (int (&arr)[3]) )[3]
{
    return arr;
}

让我们从里面走。 (int (&arr)[3])部分表示该函数接受对3个元素的int数组的引用作为参数。这与返回的arr相同。

现在,其余的语法都认为函数应该返回对3个int的数组的引用。 f是函数的名称。 int &f()表示您返回对int的引用,但您需要返回固定大小的数组,因此您应该在[3]周围添加&f(...)括号因为在C ++中,你在变量名之后写了数组的大小,而不是在类型名后面,正如Nawaz在他的回答中所解释的那样。如果省略这些括号,编译器会将f解释为引用数组,如int & f[3]中所示。