为什么C++不支持动态数组上基于范围的循环?也就是说,就像这样:
int* array = new int[len];
for[] (int i : array) {};
我刚刚发明了与new[]
和delete[]
押韵的for[]
语句。据我所知,运行时具有可用的数组大小(否则delete[]
无法工作),因此在理论上,基于范围的for循环也可以工作。它不能工作的原因是什么?
发布于 2017-11-18 15:48:16
这与动态数组无关,它更通用。当然,对于动态数组,存在能够调用析构函数的大小(但请记住,标准并没有说明任何关于这一点的内容,只说明了调用delete []
的工作方式)。
问题出在指针上,给出了一个指针,你不知道它是否对应于任何类型的of...what?
数组衰减为指针,但给定一个指针,你能说什么呢?
发布于 2017-11-18 16:41:56
原因是,只给出了指针array
的值,编译器(和您的代码)没有关于它所指向的内容的信息。唯一已知的是,array
有一个值,该值是单个int
的地址。
它可以指向静态分配的数组的第一个元素。它可以指向动态分配的数组中间的元素。它可以指向数据结构的成员。它可以指向数据结构中的数组元素。清单不胜枚举。
您的代码将对指针所指向的内容进行假设。它可以假设它是一个由50个元素组成的数组。您的代码可以访问len
的值,并假定array
指向len
元素数组的第一个元素。如果您的代码正确无误,那么一切都将按预期运行。如果你的代码出错(例如,访问一个有5个元素的数组的第50个元素),那么这个行为就是未定义的。它是未定义的,因为可能性是无穷无尽的--跟踪任意指针实际指向的内容(除了该地址上有int
的信息之外)将是巨大的。
首先假设array
指向来自new int[len]
的结果。但是这些信息并不存储在array
本身的值中,因此编译器无法返回到len
的值。这将是你的“基于范围的”方法工作所必需的。
当然,在给定array = new int[len]
的情况下,delete [] array
调用的机制会发现array
具有len
元素,并将其释放。但是,如果array
不是由new []
表达式产生的,那么delete [] array
也有未定义的行为。甚至
int *array = new int;
delete [] array;
给出未定义的行为。“运行时”不需要计算出,在这种情况下,array
实际上是单个动态分配int
(而不是实际数组)的地址。因此,它不需要应对这种情况。
https://stackoverflow.com/questions/47363608
复制相似问题