这是一个简单的例子,我找到了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;
}
答案 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;
}
作为旁注:函数定义后没有分号。此外,该函数并不特别有用,因为您可能宁愿返回最大元素的位置而不仅仅是其值:无论如何,位置是隐式确定的并且可能包含信息。当然,一旦找到正确的位置,您还应该返回正确的最佳值,这实际上是最大值的最右侧。