将数组传递给函数时的大小控制 在C++中,数组应该通过引用传递给函数。因此,在下面的内容中,函数foo应该通过引用隐式使用arrayinp void foo(double inp[10]) {} void foo1(double (&inp)[10]) {}

将数组传递给函数时的大小控制 在C++中,数组应该通过引用传递给函数。因此,在下面的内容中,函数foo应该通过引用隐式使用arrayinp void foo(double inp[10]) {} void foo1(double (&inp)[10]) {},c++,C++,我的问题是,既然假设两个函数对输入变量的解释相同,为什么我们可以在下面的过程中调用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 expressi

我的问题是,既然假设两个函数对输入变量的解释相同,为什么我们可以在下面的过程中调用
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;
}
因为这两个函数对输入变量的解释是相同的

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

但是,不会调整对数组的引用。类型信息仍然存在,它必须是对正好包含10个双精度的数组的引用。将引用传递给任何大小的数组的唯一方法是为其使用单独的函数,您可以编写函数模板来完成此操作

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

第一个是来自C的误导性工件,它实际上与
void foo(double*inp)
使用
std::array
相同。