在STL迭代器的上下文中,什么是单数和非奇异值?

Naw*_*waz 10 c++ standards pointers iterator stl

C++标准(2003)第24.1/5节中的内容如下:

正如指向数组的常规指针一样,它保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应容器的最后一个元素.这些值称为past-the-end值.定义表达式*i的迭代器i的值称为可解除引用.库从不假设过去的值是可解除引用的.迭代器也可以具有与任何容器无关的奇异值. [示例:在声明未初始化的指针x(与int*x;一样)之后,必须始终假定x具有指针的奇异值.] 对于奇异值,大多数表达式的结果是未定义的.唯一的例外是将非奇异值赋给包含奇异值的迭代器.在这种情况下,奇异值将以与任何其他值相同的方式被覆盖.可解除引用的值总是非奇异的.

我真的不明白粗体显示的文字?

  • 什么是奇异值和非奇异值?他们是如何定义的?在哪里?
  • dereferenceable值如何以及为何总是非奇异的?

tem*_*def 8

如果我理解正确,迭代器的奇异值本质上等同于未分配的指针.它是一个迭代器,尚未初始化为指向任何地方,因此没有明确定义的元素,它正在迭代.例如,声明未设置为指向范围元素的新迭代器会将迭代器创建为单数迭代器.

正如规范的部分所暗示的那样,单数迭代器是不安全的,并且不能对它们使用任何标准迭代器操作,例如增量,赋值等.您所能做的就是为它们分配一个新值,希望将它们指向有效数据.

我认为有这个定义的原因是这样的陈述

set<int>::iterator itr;
Run Code Online (Sandbox Code Playgroud)

具有标准化含义的规范可以允许.这里的术语"单数"可能是指奇点的数学定义,在不太正式的环境中也称为"不连续性".


Joh*_*itb 8

迭代器也可以具有与任何容器无关的奇异值.

我想这就是它的定义.

dereferenceable值如何以及为何总是非奇异的?

因为如果他们不这样做,解除引用它们将是未定义的行为.