range -for语句不能使用数组函数参数构建范围表达式

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

本文关键字:参数 函数 构建 范围 表达式 数组 -for 语句 不能 range      更新时间:2023-10-16

为什么不能构建将数组作为函数参数传递并在range-for语句中使用的范围表达式?谢谢你的帮助

void increment(int v[]){
    // No problem
    int w[10] = {9,8,7,6,5,4,3,2,1,9};
    for(int& x:w){
        std::cout<<"range-for-statement: "<<++x<<"n";
    }
    // error: cannot build range expression with array function 
    // parameter 'v' since parameter with array type 'int []' is 
    // treated as pointer type 'int *'
    for(int x:v){
        std::cout<<"printing "<<x<<"n";
    }
    // No problem
    for (int i = 0; i < 10; i++){
        int* p = &v[i];             
    }
}
int main()
{
    int v[10] = {9,8,7,6,5,4,3,2,1,9};
    increment(v);
}

这是因为您将数组传递给函数的方式。写入后,它衰变成指针。试着

template<int N>
void increment(int (&v)[N])
{
    for (int x : v) std::cout << "printing " << x << "n";
}
int main()
{
    int v[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 9 };
    increment(v);
}

这个运行,因为对N个int的数组的引用是在函数中传递的,并且(与指针不同)range for循环可以在这些数组上迭代。

尽管表面上看,v是一个指针,而不是一个数组——正如错误消息所说的那样。内置数组是很奇怪的东西,它不能被复制或通过值传递,并且在尴尬的时刻无声地变成指针。

无法知道它所指向的数组的大小,因此无法生成循环来遍历它。选项包括:

  • 使用合适的范围样式容器,如std::arraystd::vector
  • 将数组的大小作为额外的参数传递,并与老式循环
  • 进行交互。

函数参数int v[]调整为int *指针无论指向单个对象还是对象序列的第一个对象都不保留信息。

基于范围的for语句实际上使用了与标准函数std::beginstd::end相同的表达式,如果不知道数组的大小,就不能为指针定义它们。