reference-to-array 参数不允许数组类型衰减为指针类型。即确切的数组类型保留在函数内。 (例如,您可以在参数上使用sizeof arr / sizeof *arr 技巧并获取元素计数)。编译器还将执行类型检查,以确保数组参数类型与数组参数类型完全相同,即如果参数声明为 10 个整数的数组,则参数必须是正好 10 个数组整数,仅此而已。
事实上,在数组大小在编译时固定的情况下,使用数组引用(或数组指针)参数声明可以被视为主要参数,传递数组的首选方式。另一个变体(当数组类型被允许衰减为指针类型时)保留用于需要传递 run-time 大小的数组的情况。
例如,将编译时大小的数组传递给函数的正确方法是
void foo(int (&arr)[10]); // reference to an array
或
void foo(int (*arr)[10]); // pointer to an array
一个可以说是不正确的方法是使用“腐烂”的方法
void foo(int arr[]); // pointer to an element
// Bad practice!!!
“衰减”方法通常应为运行时大小的数组保留,并且通常在单独的参数中伴随数组的实际大小
void foo(int arr[], unsigned n); // pointer to an element
// Passing a run-time sized array
换句话说,当涉及到数组引用(或数组指针)传递时,真的没有“为什么”的问题。如果数组大小在编译时固定,则默认情况下,您应该自然地使用此方法。当您使用数组传递的“衰减”方法时,应该真正出现“为什么”的问题。 “decayed”方法只应该用作传递运行时大小数组的特殊技巧。
以上基本上是更通用原则的直接结果。当你有一个T 类型的“重”对象时,你通常通过指针T * 或引用T & 传递它。数组也不例外。他们没有理由这样做。
请记住,尽管在实践中,编写与运行时大小的数组一起工作的函数通常是有意义的,尤其是在涉及通用库级函数时。这样的功能更加通用。这意味着在现实生活中的代码中通常有充分的理由使用“衰减”方法,然而,这并不能成为代码作者识别在编译时已知数组大小并使用引用的情况的借口-array 方法。