跟进Range-for-statement cannot build range expression with array function parameter。
原始错误是:
错误:无法使用数组函数参数构建范围表达式' arr'因为参数有数组类型' int []'被视为指针类型' int *'
失败的代码:
void print(int (&arr)[int]){
for(int x: arr)
cout<<" "<<x;
cout<<endl;
}
固定代码:
template<int N>
void print(int (&arr)[N]){
for(int x: arr)
cout<<" "<<x;
cout<<endl;
}
我的问题是,为什么我们必须像这样修理它?我不明白int (&arr)[int]
的含义。
答案 0 :(得分:0)
你的问题有点令人困惑,因为你的第一个例子不是有效的代码。
但是,我认为这里仍有解释。这是你的第一个功能的“正确”版本:
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!
}
print()
函数采用5个int的数组作为参数。请注意,这只能通过静态大小的数组来完成。 编译器在编译函数时必须知道数组的大小,并且该函数仅适用于该特定的数组大小。
让我们与你的第二个有效例子进行对比。
单个数组大小,这有点烦人。如果我不想为各种数组大小编写不同的函数怎么办?我们总是可以传递指针和大小,但这有点难看(更不用说容易出错)。
相反,我们可以为编译器提供功能模板。也就是说,不是一个函数,而是一个如何按需创建函数的方法。
template<int N>
void print(int (&arr)[N]){
for(int x: arr)
cout<<" "<<x;
cout<<endl;
}
常量5
已被placeholder constant
N(必须是int
所取代,如模板声明中所指定。这样,编译器将生成一个单独的我们称之为每个数组大小的print()
函数。
答案 1 :(得分:0)
背后的基本原理是C ++只允许constepr用于数组维度。模板版本确保N
是constepr(编译时常量),而不正确的版本允许您认为您打算使用运行时整数值作为数组大小 - 这在C ++中是不允许的