range -for语句不能使用数组函数参数构建范围表达式
Range-for-statement cannot build range expression with array function parameter
为什么不能构建将数组作为函数参数传递并在range-for语句中使用的范围表达式?谢谢你的帮助
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);
}
这是因为您将数组传递给函数的方式。写入后,它衰变成指针。试着
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);
}
这个运行,因为对N个int
的数组的引用是在函数中传递的,并且(与指针不同)range for循环可以在这些数组上迭代。
尽管表面上看,v
是一个指针,而不是一个数组——正如错误消息所说的那样。内置数组是很奇怪的东西,它不能被复制或通过值传递,并且在尴尬的时刻无声地变成指针。
无法知道它所指向的数组的大小,因此无法生成循环来遍历它。选项包括:
- 使用合适的范围样式容器,如
std::array
或std::vector
- 将数组的大小作为额外的参数传递,并与老式循环 进行交互。
函数参数int v[]
调整为int *
指针无论指向单个对象还是对象序列的第一个对象都不保留信息。
基于范围的for语句实际上使用了与标准函数std::begin
和std::end
相同的表达式,如果不知道数组的大小,就不能为指针定义它们。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类