【问题标题】:Size control on passing array to function [duplicate]将数组传递给函数的大小控制[重复]
【发布时间】:2019-03-28 06:34:18
【问题描述】:

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

【问题讨论】:

  • 第一个是来自C的误导神器,其实和void foo(double* inp)是一样的
  • 改用std::array

标签: c++


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2011-03-04
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多