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

Size control on passing array to function

本文关键字:控制 函数 数组      更新时间:2023-10-16

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

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

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

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

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