作为a question concerning comparing invalid iterators的后续,我试图在C ++标准中找到无效迭代器的允许表达式的定义。搜索“invalid iterator”只能在§24.2.1.11中找到一个引用。它表示无效迭代器可能是“单数”,但只说取消引用它们可能是未定义的行为。没有进一步的语义。
其中一个原始答案表明它是实现定义的行为,但我认为这一般不能假设,因为上面提到的段落明确提到了UB。
This answer显示“无效指针值的任何其他使用都具有实现定义的行为”。由于向量的迭代器通常被实现为指针,我认为比较两个无效的迭代器至少是实现定义的行为。
有人能指出我在标准中定义无效迭代器语义的相关部分吗?
答案 0 :(得分:3)
也许[iterator.requirements.general,24.2.1] / 6包含你想要的东西?
对于奇异值,大多数表达式的结果未定义; 唯一的例外是破坏一个包含奇异值的迭代器,一个非奇异的赋值 值为包含奇异值的迭代器,对于满足
DefaultConstructible
的迭代器 要求,使用值初始化的迭代器作为复制或移动操作的源。 [注意:这个 默认初始化不提供保证,但区别仅对具有微不足道的类型有效 默认构造函数,如指针或包含指针的聚合。 - 尾注]在这些情况下单数 值被覆盖的方式与任何其他值相同。可解除引用的值总是非单数的。
此外,无效迭代器由第11段定义:
无效迭代器是一个可能是单数的迭代器。
因此,无效迭代器至少与奇异迭代器一样受限制;具体而言,唯一允许的操作是销毁和分配。