开发者

std::list<>: Element before l.begin()

Short question: Is the following code unsafe using other compilers than I do (mingw32), or is it valid to use?

list<int> l;
/* add elements */
list<int>::iterator i = l.begin();
i--;
i++;
cout << *i << endl;

...or in other words: is i defined to point to l开发者_StackOverflow.begin() after this?


Yes, the code is unsafe. Once you attempt to move before begin() you have caused undefined behavior. Attempting to move "back again" may not work.


A std::list traverses its contents via linked list pointers, so pointer arithmetic is not used to calculate a correct position. The previous position from .begin() will have no data and shouldn't provide any valid traversal mechanisms.

Containers like std::vector have random access iterators and would use pointer arithmetic under the covers, so they would probably give the right result (no problem), but its still a bad idea.

So, it shouldn't work, its undefined, and don't do it even if it does work somehow :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜