在功能中引用Auto Array Iterator

时间:2014-03-16 20:12:29

标签: c++ arrays c++11

这是一个简单的例子,我找到了Max of a Array。

我试图在传递给我的函数的数组中使用自动迭代器。 当我在我的函数体中使用相同的代码时没有错误。

函数max中的引用会产生编译错误

cpp:7:14: error: invalid range expression of type 'int *'; no viable 'begin' function available
        for (auto& x: array){
                    ^ ~~~~~

这是我当前的代码,我在“normalMax”和内联主体函数中包含对正常用法的引用。

我想知道为什么'max'函数中的迭代器会产生错误

#include <iostream>
//max num

//causes an error
int max(int* array){
    int max = 0;
    for (auto& x: array){
        if (x >max)
            max = x;
    }
return max;
};
//normal behavior
int normalMax(int* array){
    int max = 0;
    for (int i=0; i<4; i++){
        if (i >max)
            max = i;
    }
return max;
};

int main(){

    int A[] = {1,2,3,4,5};
    int B[] = {5,6,10,100};
    int max = 0;
    //Works no Error
    for (auto& x: B){
        if (x >max)
            max = x;
    }
    std::cout <<max;
    //100
    normalMax(B);
    //max(B);
    //compile error
    return 0;
}

1 个答案:

答案 0 :(得分:6)

如果要将数组传递给函数,以便编译器可以推导出它的长度,则需要将其作为引用而不是通过[decayed]指针传递:

template <std::size_t N>
int max(int const (&array)[N]) {
    int max = 0;
    for (auto& x: array) {
        if (x >max) {
            max = x;
        }
    }
    return max;
}

作为旁注:函数定义后没有分号。此外,该函数并不特别有用,因为您可能宁愿返回最大元素的位置而不仅仅是其值:无论如何,位置是隐式确定的并且可能包含信息。当然,一旦找到正确的位置,您还应该返回正确的最佳值,这实际上是最大值的最右侧。