将数组传递给函数的大小控制

时间:2019-03-28 06:34:19

标签: c++

在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;
}

1 个答案:

答案 0 :(得分:3)

  

因为两个函数应该对输入变量具有相同的解释

但是他们没有。类型为double inp[10]的函数自变量会自动调整为指针double*。 10在这里不提供类型信息。由于所有数组都会衰减为指针,因此您可以传递任意大小的数组。

但是,对数组的引用未进行调整。类型信息仍然存在,并且必须是对精确地为十个double的数组的引用。将引用传递给任何大小的数组的唯一方法是为其提供单独的函数,您可以编写一个函数模板来完成

template<std::size_t N>
void foo2(double (&inp)[N]) {}