list<int> foo;
list<int> foo2;
list<int>::iterator foo_end = foo.end();
list<int>::iterator foo2_end = foo2.end();
for (list<int>::iterator it = foo.begin(); it != foo2_end; ++foo) <- notice != comparison here
{
...
这是允许的吗?它会正常工作吗?
我倾向于认为这是依赖于实现的,任何人都知道标准是否说明了这一点?
答案 0 :(得分:7)
有关于此的报道(LWG defect 446)存在缺陷。缺陷报告询问是否有效比较引用不同容器元素的迭代器。
缺陷报告中的注释解释说,这样做的意图当然是未定义的,但没有明确说明它是未定义的。
建议的解决方案是在标准中添加以下内容,明确指出它未定义:
直接或间接评估任何比较函数或二元 - 运算符的结果,其中两个迭代器值作为参数从两个不同的范围r1和r2(包括它们的过去值)获得,这两个范围不是一个子范围除非另有明确说明,否则公共范围是未定义的。
编辑:该语言未包含在C ++ 0x FCD中。事实上,N3066的变化解决了这个问题;特别是以下补充(§24.2.5/ 2):
前向迭代器的
==
域是相同底层序列上的迭代器的域。
答案 1 :(得分:2)
是 允许(即将编译) 否它无法正常工作。
foo2_end
指向foo2
的末尾,而不是foo
,因此您的迭代器将从foo
的开头开始,到达foo2
的末尾时结束1}},这将永远不会,因为你正在迭代foo
。一旦it
迭代超过foo
的末尾,您将遇到段错误。
注意:我认为您打算写++it
,而不是++foo
。
答案 2 :(得分:1)
它会编译但会导致seg错误。迭代器是特定于对象的,比较来自不同对象的两个迭代器总是会产生不等式。因此,it != foo2_end
表达式将始终评估为true,并且当it
到达foo.end()
并且您尝试取消引用它时,程序将崩溃。