简短的问题:使用其他编译器(而非mingw32)是否会使以下代码不安全,或者可以继续使用?
list<int> l;
/* add elements */
list<int>::iterator i = l.begin();
i--;
i++;
cout << *i << endl;
换句话说,这意味着在执行此操作后,i
是否被定义为指向l.begin()
?
是的,这段代码是不安全的。如果在begin()
之前尝试移动,你将导致未定义行为。尝试"再次后退"可能无法正常工作。
std::vector<>
这样的容器的迭代器仍然受到标准中关于双向迭代器的规则的约束,该规则明确指出这是未定义的行为。 - ildjarn
list.end()
不是一个左值,因此它不是良好的形式。仅当列表不为空时,您才可以将指向list.end()
的迭代器递减。 - CB Bailey