你如何创造一个功能"尺寸感知"它的参数?

时间:2012-08-20 16:05:51

标签: c++

从这里开始:https://stackoverflow.com/a/3473454/499125

int ( &fillarr( int (&arr)[5] ) )[5] { // no decay; argument must be size 5
    return arr;
}

上面的定义可以强制编译器对其参数进行大小感知。这句话对我来说似乎很复杂。有人可以解释这个陈述或解释陈述如何达到规模意识吗?

可以扩展它来处理多个参数吗?

2 个答案:

答案 0 :(得分:8)

这一切都归结为能够阅读声明。编写完全相同的更简单的方法是:

typedef int int5[5]; // create a typedef
int5& fillarr( int5& ) {
}

截至阅读原始声明的确切方式,只需将其分解为:

int (&fillarr( int (&arr)[5] ))[ 5 ];
               ^^^^^^^^^^^^^           // A: reference to array of 5 int
^^^^^^                        ^^^^^^   // B: reference to array of 5 int
      ^^^^^^^^               ^         // C: function taking A and returning B

答案 1 :(得分:2)

您可以分为两部分理解:1)返回值和2)参数类型:

int ( &fillarr() )[5] {
  static int arr[5];
  return arr;
}

我们可以查看类型:int (&fillarr())[5]。为了理解这一点,遗憾的是旧的C规则:“声明就像表达式中的用法”不适用于引用,所以让我们看一下类似的声明:

int (*fillarr())[5];

这是一个将指针而不是引用返回到大小为5的数组的函数。我该如何计算?好吧,假设我们有一个函数f返回一个指向int数组的指针,我们将如何访问第五个元素?让我们看看,我们首先要调用函数:f()。然后我们必须取消引用结果*f(),然后访问第五个元素(不存在,但忽略它)(*f())[5]这是一个int。这正是声明语法:

int x;
int (*f())[5];
x = (*f())[5];
//    ^^^-------- call f -> yields pointer to array of 5 ints
//   ^----------- dereferene the result of f -> yields array of 5 ints
//        ^^^---- access the fifth element

现在,您只需将*替换为&,因为您在示例中返回了引用。

参数语法类似。