假设您有一个随机访问迭代器(例如std::vector myVector
)
当iter + someInt
是过去的迭代器时,
iter + someInt == myVector.end()
??
或者它可能与myVector.end()
不同吗?
答案 0 :(得分:5)
这是未定义的行为。什么都可能发生。仅举几个选项:什么都没有,程序退出,异常,崩溃。
答案 1 :(得分:2)
这是未定义的行为,标准没有说明结果。
答案 2 :(得分:2)
根据C ++标准(2003),这将调用未定义的行为。
答案 3 :(得分:1)
结果未被C ++标准定义。
答案 4 :(得分:0)
在c ++标准之后,这确实会导致未定义的行为(请参阅其他答案),有时会出现问题,实际会发生什么?
事实上,这通常不是神秘的,并且非常清楚将会发生什么,但它取决于所使用的编译器及其版本及其标准库和编译器标志以及您的操作系统。 这也意味着,你绝对不应该依赖它(例如,下一个编译器版本可能会改变行为)。
对于您的问题(您不应该依赖以下内容): 在当前的编译器(gcc,msvc,intel c ++编译器)中,std :: vector通常(至少)有两个成员:
T* _begin_; // pointing to begin of array of vector
T* _end_; // pointing to end(), note that array might be larger due to reserve()
所以通常你会得到超出 end 的指针:没有任何意义。通常你甚至可以轻易地解除引用(因为数组大于
)_end_-_begin_
或者因为程序可以访问内存。当然,内容可能是垃圾。
如果您真的感兴趣,请查看汇编代码(优化和不优化)。