C++ C++;将整数数组作为参数传递时出错

C++ C++;将整数数组作为参数传递时出错,c++,arrays,C++,Arrays,后续行动 最初的错误是: 错误:无法使用数组函数参数“arr”生成范围表达式,因为数组类型为“int[]”的参数被视为指针类型“int*” 失败的代码: void print(int (&arr)[int]){ for(int x: arr) cout<<" "<<x; cout<<endl; } void打印(int(&arr)[int]){ 用于(整数x:arr) cout您的问题有点令人困惑,因为您的第一个示例不

后续行动

最初的错误是:

错误:无法使用数组函数参数“arr”生成范围表达式,因为数组类型为“int[]”的参数被视为指针类型“int*”

失败的代码:

void print(int (&arr)[int]){
    for(int x: arr)
        cout<<" "<<x;
    cout<<endl;
}
void打印(int(&arr)[int]){
用于(整数x:arr)

cout您的问题有点令人困惑,因为您的第一个示例不是有效的代码

但是,我认为这里仍然有一个解释。这是您的第一个函数的“正确”版本:

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!
}

常量
5
已替换为
占位符常量
N(必须是
int
,如模板声明中所指定。这样,编译器将生成一个单独的
print()对于每个数组大小,我们称之为.< /p> ,其背后的原理是C++只允许数组维数的CONSTPR。模板版本确保<代码> n< /COD>是CONSTPR(编译时常数)。虽然错误的一个让你认为你打算使用一个运行时整数值来数组大小,这是在C++中被禁止的。但是为什么这个错误会被修正呢?因为第一个例子不是有效的C++,而第二个例子是不正确的。我不清楚你到底在问什么。“如何理解<代码> int(& ARR)[INT] < /代码>?”作为无效语法。哪个编译器为您提供了第一个代码段的错误消息?我已经通过GCC、Clang和MSVC运行了它,他们三个都给出了关于
[int]的错误
我使用了g++-std=c++11。您的意思是,如果我们声明一个以数组作为输入的函数,我们必须指定数组大小,因为编译器必须知道数组大小?这也是因为数组不是动态大小吗?@LushaLi“指定数组大小,因为编译器必须知道数组大小?”是的。为了对
循环使用基于范围的
,编译器需要知道大小以便知道停止的位置。“这也是因为数组没有动态调整大小吗?”不。动态分配实际上会使情况变得更糟,因为无法从指针推断数组的大小。真正的问题是数组在传递到函数时会衰减为指针。这里有更多相关内容:
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!
}
template<int N>
void print(int (&arr)[N]){
    for(int x: arr)
        cout<<" "<<x;
    cout<<endl;
}