将数组传递给函数时的大小控制 在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
相同。