std :: list <>:l.begin()之前的元素

shr*_*ddr 4 c++ list

简短的问题:以下代码使用其他编译器是不安全的(mingw32),还是有效使用?

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

...或换句话说:被i定义为指向l.begin()此之后?

CB *_*ley 12

是的,代码不安全.在begin()您导致未定义的行为之前尝试移动.试图再次"回来"可能行不通.

  • @SethCarnegie:`list.end()`不是左值,因此形成不好.当且仅当列表不为空时,您可以递减指向`list.end()`的迭代器. (2认同)
  • @Tomalak:他可以有一个参考没关系,只是如果他取消引用它,他会引用和未定义的标准. (2认同)