传递整数数组作为参数

时间:2018-05-31 17:41:28

标签: c++ arrays

跟进Range-for-statement cannot build range expression with array function parameter

原始错误是:

  

错误:无法使用数组函数参数构建范围表达式' arr'因为参数有数组类型' int []'被视为指针类型' int *'

失败的代码:

void print(int (&arr)[int]){
    for(int x: arr)
        cout<<" "<<x;
    cout<<endl;
}

固定代码:

template<int N>
void print(int (&arr)[N]){
    for(int x: arr)
        cout<<" "<<x;
    cout<<endl;
}

我的问题是,为什么我们必须像这样修理它?我不明白int (&arr)[int]的含义。

2 个答案:

答案 0 :(得分:0)

你的问题有点令人困惑,因为你的第一个例子不是有效的代码。

但是,我认为这里仍有解释。这是你的第一个功能的“正确”版本:

void print(int (&arr)[5]){
    for(int x: arr)
        cout<<" "<<x;
    cout<<endl;
}

void foo() {
    int x[5];
    int y[3];

    print(x);
    print(y); // Bam! error!
}

print()函数采用5个int的数组作为参数。请注意,这只能通过静态大小的数组来完成。 编译器在编译函数时必须知道数组的大小,并且该函数仅适用于该特定的数组大小。

让我们与你的第二个有效例子进行对比。

单个数组大小,这有点烦人。如果我不想为各种数组大小编写不同的函数怎么办?我们总是可以传递指针和大小,但这有点难看(更不用说容易出错)。

相反,我们可以为编译器提供功能模板。也就是说,不是一个函数,而是一个如何按需创建函数的方法。

template<int N>
void print(int (&arr)[N]){
    for(int x: arr)
        cout<<" "<<x;
    cout<<endl;
}

常量5已被placeholder constant N(必须是int所取代,如模板声明中所指定。这样,编译器将生成一个单独的我们称之为每个数组大小的print()函数。

答案 1 :(得分:0)

背后的基本原理是C ++只允许constepr用于数组维度。模板版本确保N是constepr(编译时常量),而不正确的版本允许您认为您打算使用运行时整数值作为数组大小 - 这在C ++中是不允许的