stackoverflow.com上最受欢迎的C++帖子《迭代器失效规则》称,不清楚past-the-end迭代器(即通过end()
、cend()
、rend()
和crend()
返回的迭代器)是否按照指向容器元素的普通迭代器相同的规则失效。这些声明适用于2003年和2011年的C++,它们推迟到一个讨论《末位迭代器失效规则》的帖子,在该帖子中,被采纳的答案表明2003标准在此问题上存在歧义。这个结论是基于23.1/10的一条评论(在swap()
的上下文中),似乎暗示当规范没有明确提到past-the-end迭代器的失效时,它们可能会失效。
该帖子的一个问题评论(由mike-seymour发表)表明,在deque
的情况下,C++11对此事是明确的。我的问题是关于所有容器的:
- 在C++11中,是否有任何容器操作可能使past-the-end迭代器失效,并且该行为在语言规范中存在歧义?
换句话说,
- 在执行不会说明可能使past-the-end迭代器失效的容器操作之后,我可以信任past-the-end迭代器的有效性吗?
vector::erase
会“使在删除点或之后位置的迭代器和引用失效”。尾迭代器必然“位于删除点之后”。 - James McNellisvector::reserve()
怎么样呢?23.3.6.3/5(我有修订版n3337):“重新分配使指向序列中的元素的所有迭代器失效”,而此列表不包括过去的结束迭代器,根据定义,它们不指向序列中的元素。然而,SGI实现使所有迭代器无效,可能也包括过去的结束迭代器 [http://www.sgi.com/tech/stl/Vector.html#5]。更多信息:https://dev59.com/lXI-5IYBdhLWcg3w483k#1624961 - nknight