向量中的无效迭代器

Pow*_*ice 4 c++ iterator vector undefined-behavior language-lawyer

我知道擦除会在擦除点之后和之后使迭代器无效.考虑:

std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.end() - 1; //last element
vec.erase(vec.begin()); //shift everything one to the left, 'it' should be the new 'end()' ?
std::cout << (it == vec.end()); //not dereferencing 'it', just comparing, UB ?
Run Code Online (Sandbox Code Playgroud)

比较(而不是取消引用)无效的迭代器(it在这种情况下)是未定义的行为吗?如果没有,it == vec.end()保证是真的吗?

编辑:从顶部答案看,如果只是it一个奇异的值,这就是UB .但是在STL迭代器的上下文中,什么是单数和非奇异值?它似乎it是(或曾经)与容器相关联,因此it 非单数形式.

我很感激对此进行进一步的分析,谢谢.

Lig*_*ica 6

一旦你的迭代器失效,甚至可以将UB与其他东西进行比较:

[C++14: 24.2.1/10]:一个无效的迭代器是一个迭代器可能是单数.

[C++14: 24.2.1/5]: [..]对于奇异值,大多数表达式的结果都是未定义的; 唯一的例外是销毁一个包含奇异值的迭代器,一个非奇异值赋值给一个包含奇异值的迭代器,对于满足DefaultConstructible需求的迭代器,使用一个值初始化的迭代器作为一个源.复制或移动操作.[..]

请注意,这意味着您也无法将默认构造的迭代器与任何迭代器进行比较.end().

与普遍认为"指针只是内存地址"相反,这些规则对于指针来说也是如此.实际上,迭代器的规则是指针规则的概括.