为无效迭代器定义了哪些操作?

时间:2015-10-12 08:00:46

标签: c++ vector stl language-lawyer

作为a question concerning comparing invalid iterators的后续,我试图在C ++标准中找到无效迭代器的允许表达式的定义。搜索“invalid iterator”只能在§24.2.1.11中找到一个引用。它表示无效迭代器可能是“单数”,但只说取消引用它们可能是未定义的行为。没有进一步的语义。

其中一个原始答案表明它是实现定义的行为,但我认为这一般不能假设,因为上面提到的段落明确提到了UB。

This answer显示“无效指针值的任何其他使用都具有实现定义的行为”。由于向量的迭代器通常被实现为指针,我认为比较两个无效的迭代器至少是实现定义的行为。

有人能指出我在标准中定义无效迭代器语义的相关部分吗?

1 个答案:

答案 0 :(得分:3)

也许[iterator.requirements.general,24.2.1] / 6包含你想要的东西?

  

对于奇异值,大多数表达式的结果未定义;   唯一的例外是破坏一个包含奇异值的迭代器,一个非奇异的赋值   值为包含奇异值的迭代器,对于满足DefaultConstructible的迭代器   要求,使用值初始化的迭代器作为复制或移动操作的源。 [注意:这个   默认初始化不提供保证,但区别仅对具有微不足道的类型有效   默认构造函数,如指针或包含指针的聚合。 - 尾注]在这些情况下单数   值被覆盖的方式与任何其他值相同。可解除引用的值总是非单数的。

此外,无效迭代器由第11段定义:

  

无效迭代器是一个可能是单数的迭代器。

因此,无效迭代器至少与奇异迭代器一样受限制;具体而言,唯一允许的操作是销毁和分配。