缺少迭代器无效性是否暗示着推进迭代器的有效性?

Meh*_*dad 4 c++ iterator language-lawyer

当C ++标准说迭代器没有被“无效”时,这是仅指代取消引用的能力,还是暗示着遍历功能的某些意义?

例如,如果swap/ insert/ etc。确保一个容器不会使任何迭代器无效,此事实是否意味着还可以保证推进一个旧的迭代器也是有效的?如果是这样,是否可以保证以与新迭代器相同的顺序遍历元素?

(我在这里询问的是传统的/“旧式”迭代器,尽管如果新样式有任何区别,那么提及它当然也会有所帮助。)

Jes*_*uhl 5

“当C ++标准说迭代器没有被“无效”时,这是仅指代取消引用的能力,还是暗示着遍历功能的某些意义?”

如果迭代器没有失效,则它保持有效(在所有方面)。如果它无效,则它将变为无效(出于所有目的(取决于迭代器,其可能包含取消引用,也可能包含取消引用))。“对取消引用有效”和“对增量有效”之间没有区别。无论出于任何目的,它都是有效的无效的。相当二进制。

标准中唯一关于无效迭代器的唯一内容是:

在:n4820

23.3.1总的来说[iterator.requirements.general]

15无效的迭代器是可能为单数的迭代器。233

注意:233)此定义适用于指针,因为指针是迭代器。取消引用已经无效的迭代器的效果是不确定的。

奇异值:

23.3.1总的来说[iterator.requirements.general]

7 ...大多数表达式的结果都没有为奇异值定义;唯一的例外是破坏其保持一个迭代奇异值,非奇异值对包含一个迭代器的分配奇异值,并且,对于满足Cpp17DefaultConstructible要求迭代器,使用一个值初始化的迭代器作为源复制或移动操作。...

  • @Mehrdad ** end **迭代器是不可迭代的有效迭代器的典型情况(例如,在`std :: vector`中) (3认同)
  • @Mehrdad然后可能添加[language-lawyer]标签? (2认同)