【发布时间】:2019-12-28 08:05:13
【问题描述】:
假设我有一个数组int x[10];,并且在我的 C++ 抽象机实现中,指向该数组的指针不等于指向其“第一个”元素的指针(应用数组到指针转换的结果到x) 但比较等于指向“最后一个”元素x[9] 的指针。 IE。 (void*)x == (void*)&x 是 false 和 (void*)&x[9] == (void*)&x 是 true。
这样的实现是否符合要求?我唯一知道它“违反”的是[basic.compound]/4 中的非规范注释:
[注意:数组对象和它的第一个元素不是指针可互转换的,即使它们具有相同的地址。 —— 尾注]
【问题讨论】:
-
我正在尝试理解您的问题。这是 C++ 合并C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3) 的区域,然后扩展了标准,将指针声明为
prvalue类型为"pointer to T"。 C++ Standard 7.3.2 Array-to-pointer conversion。 C++ 标准明确声明"The result is a pointer to the first element of the array."那么您的结果有何不同? -
@DavidC.Rankin 是的,数组到指针转换的结果是指向数组第一个元素的指针。我们可以想象它表示编号为
0的数组元素(用于指针运算)。这个指针是否必须比较等于指向整个数组的指针?直觉上是的,但我不知道有任何规范性的措辞这样说。或者你可以从中推断出的措辞。 -
在标题中进行比较是不正确的。您实际上是在询问代码
(void*)x == (void*)&x。在这种情况下,您将转换结果与void *进行比较。 -
上面的7.3.2 C++ Array Pointer Conversion链接应该是这个。
-
好的,所以你在“如果?”中问这个问题。 C++ 的实现 C++ 7.3.2 的结果是指向最后一个元素而不是第一个元素的指针——“那会符合要求吗?”唯一可以给出的答案是(1)不是对 C++ 标准的当前草案,而是(2)对你的“如果?”是肯定的。自己的实施。除此之外,我仍然很难理解你在问什么。
标签: c++ arrays pointers language-lawyer c++17