首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么C++不支持动态数组的基于范围的for循环?

为什么C++不支持动态数组的基于范围的for循环?
EN

Stack Overflow用户
提问于 2017-11-18 15:19:09
回答 2查看 4K关注 0票数 19

为什么C++不支持动态数组上基于范围的循环?也就是说,就像这样:

代码语言:javascript
复制
int* array = new int[len];
for[] (int i : array) {};

我刚刚发明了与new[]delete[]押韵的for[]语句。据我所知,运行时具有可用的数组大小(否则delete[]无法工作),因此在理论上,基于范围的for循环也可以工作。它不能工作的原因是什么?

EN

回答 2

Stack Overflow用户

发布于 2017-11-18 15:48:16

这与动态数组无关,它更通用。当然,对于动态数组,存在能够调用析构函数的大小(但请记住,标准并没有说明任何关于这一点的内容,只说明了调用delete []的工作方式)。

问题出在指针上,给出了一个指针,你不知道它是否对应于任何类型的of...what?

数组衰减为指针,但给定一个指针,你能说什么呢?

票数 3
EN

Stack Overflow用户

发布于 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也有未定义的行为。甚至

代码语言:javascript
复制
  int *array = new int;
  delete [] array;

给出未定义的行为。“运行时”不需要计算出,在这种情况下,array实际上是单个动态分配int (而不是实际数组)的地址。因此,它不需要应对这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47363608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档