为什么print函数中的for(auto)范围循环报错,main函数中却正常编译?
编译错误原因解析
根本原因:数组传参时发生类型退化,丢失了编译期可识别的长度信息
C++范围for循环的运行依赖编译期获取遍历对象的首尾边界:
main函数中定义的arr完整类型是int[12],长度在编译阶段就已经确定,编译器可以直接调用std::begin(arr)、std::end(arr)获取数组的首尾地址,所以范围for可以正常编译运行。- 当数组按
void print(int x[],int n)的形式作为函数形参声明时,C++语法会自动将数组形参退化为int*类型的指针,此时x已经不携带任何数组长度信息,编译器无法为int*类型匹配到对应的end实现,就会抛出你遇到的报错。
修复参考方案
如果需要在自定义函数中使用范围for遍历数组,可以通过模板保留数组的长度信息,示例实现如下:
#include <iostream> // 模板参数N会自动推导为传入数组的长度 template<size_t N> void print(int (&x)[N]) { for(auto i:x) std::cout<<i<<" "; } int main() { int arr[] = {1, 5, 2, 1, 4, 3, 1, 7, 2, 8, 9, 5}; for(auto i:arr) std::cout<<i<<" "; print(arr); return 0; }
内容的提问来源于stack exchange,提问作者user15546080
相关产品推荐
相关产品推荐

