从这里开始:https://stackoverflow.com/a/3473454/499125
int ( &fillarr( int (&arr)[5] ) )[5] { // no decay; argument must be size 5
return arr;
}
上面的定义可以强制编译器对其参数进行大小感知。这句话对我来说似乎很复杂。有人可以解释这个陈述或解释陈述如何达到规模意识吗?
可以扩展它来处理多个参数吗?
答案 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
现在,您只需将*
替换为&
,因为您在示例中返回了引用。
参数语法类似。