【发布时间】:2019-05-16 06:36:13
【问题描述】:
代码示例:
list<int> mylist{10, 20, 30, 40};
auto p = mylist.end();
while (true)
{
p++;
if (p == mylist.end()) // skip sentinel
continue;
cout << *p << endl;
}
我想知道,从标准(C++17、n4810)的角度来看,这段代码在多大程度上是合法的? 我正在寻找与上述示例相关的双向迭代器要求,但没有运气。
我的问题是:
能够通过end(),是实现细节还是标准要求?
【问题讨论】:
-
库从不假定过去的值是可取消引用的。我认为这不仅适用于
end,也适用于之后的情况。 -
无论如何你都应该使用
++p而不是p++。预增量有正确的用法;你的不是其中之一。 -
你的编译器(哪一个?)有一些调试模式(检查迭代器、消毒器等)吗?启用它会回答这个问题。
标签: c++ stl iterator language-lawyer