【问题标题】:Is the "one-past-the-end" pointer of a non-array type a valid concept in C++?非数组类型的“one-past-the-end”指针是 C++ 中的有效概念吗?
【发布时间】:2013-01-08 11:24:08
【问题描述】:

C++ 标准 [sec 5.7] 说:

如果指针操作数和结果都指向同一个数组对象的元素,或者一个过去 数组对象的最后一个元素,评估不应产生溢出;否则,行为是 未定义。

那么,我是否正确假设未定义其他类型的指针,而不是数组?

例如:

int a = 0;
vector<int> v(&a, (&a)+1);

上面的 sn-p 编译和工作都很好(使用 g++),但它有效吗?

【问题讨论】:

  • 我想评论一下pointers one-past-the-end of other types than arrays are undefined?指针 总是被定义的,因为它们只是数字、地址。然而,这个指针的 value 是未定义的。您不能取消引用这些指针。但是vector构造函数并没有取消引用它们,所以没关系。
  • 是的,但地址空间不是无限的。所以有一个指向地址空间中最后一个元素的指针。增加该指针是没有意义的。
  • 指针不仅仅是数字。 C++ 标准非常清楚地表明您不能对指针使用任意加法和减法。特别是在数组之前使用指向 1 的指针以适应基于 1 的算法的做法会导致未定义的行为。 AFAIK 存在或曾经是计算机体系结构,其中将不指向有效内存的值加载到指针寄存器中可能会导致陷阱。
  • "指针总是被定义的,因为它们只是数字、地址。" ——大错特错。听说过段寄存器吗?
  • 哪个标准?

标签: c++ pointers pointer-arithmetic


【解决方案1】:

不,这是合法的。 5.7(4) - 引用前的一段 - 说:“出于这些运算符的目的,指向非数组对象的指针与指向 长度为 1 的数组的第一个元素,其元素类型为对象的类型。"

【讨论】:

  • 你的意思是“有效”,而不是“合法”,我想。否则很多程序员可能不得不入狱。
  • 是的。 'legal' = "有效,根据 C++ 语言规范"
  • @Cheersandhth.-Alf:除非鼻恶魔先得到他们。
  • 只是为了确认,直到 C++17 仍然是这种情况(碰巧将文本移动到脚注并稍微重写)。
  • 来自 [basic.compound/3] eel.is/c++draft/basic.compound#3 的当前措辞“......一个不是数组元素的 T 类型对象被认为属于一个具有一个 T 类型元素的数组。 "
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多