在C ++中,应该通过引用将数组传递给函数。因此,接下来,函数foo
应该通过引用隐式使用数组inp
。
void foo(double inp[10]) {}
void foo1(double (&inp)[10]) {}
我的问题是,由于两个函数都应该对输入变量具有相同的解释,为什么我们接下来可以调用foo
,却不能调用foo1
?
int main()
{
double ary[20];
foo(ary); // compiles without any problem.
foo1(ary); // compiler error: invalid initialization of reference of type ‘double (&)[10]’ from expression of type ‘double [20]’
return 0;
}
答案 0 :(得分:3)
因为两个函数应该对输入变量具有相同的解释
但是他们没有。类型为double inp[10]
的函数自变量会自动调整为指针double*
。 10在这里不提供类型信息。由于所有数组都会衰减为指针,因此您可以传递任意大小的数组。
但是,对数组的引用未进行调整。类型信息仍然存在,并且必须是对精确地为十个double的数组的引用。将引用传递给任何大小的数组的唯一方法是为其提供单独的函数,您可以编写一个函数模板来完成
template<std::size_t N>
void foo2(double (&inp)[N]) {}