Range-for-statement无法使用数组函数参数构建范围表达式

时间:2014-06-08 10:28:10

标签: c++

为什么无法构建范围表达式,将数组作为函数参数传递并在范围内用于语句。 谢谢你的帮助

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

3 个答案:

答案 0 :(得分:9)

尽管出现了问题,v是指针而不是数组 - 正如错误消息所示。内置数组是奇怪的东西,不能被值复制或传递,并且在尴尬的时刻默默地变成指针。

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

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

答案 1 :(得分:5)

这是因为你将数组传递给函数的方式。正如所写,它衰败到指针。试试

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

这个runs因为在函数中传递了对N int s数组的引用,并且(与指针不同)for循环的范围可以迭代它们。

答案 2 :(得分:3)

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

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