比较来自不同容器的迭代器

fre*_*low 36 c++ comparison iterator stl

比较来自不同容器的迭代器是否合法?

std::vector<int> foo;
std::vector<int> bar;
Run Code Online (Sandbox Code Playgroud)

表达式是否会foo.begin() == bar.begin()产生错误或未定义的行为?

(我正在编写一个自定义迭代器,并在实现时偶然发现了这个问题operator==.)

jwe*_*ich 33

如果考虑C++ 11标准(n3337):

§24.2.1 - [iterator.requirements.general#6]

迭代器j被称为从一个迭代可达i当且仅当存在的表达的应用程序的有限序列++i,使i == j.如果j可以从i,则它们引用相同序列的元素.

§24.2.5 - [forward.iterators#2]

==前向迭代器的域是相同底层序列上的迭代器的域.

鉴于RandomAccessIterator必须满足所有要求ForwardIterator,比较来自不同容器的迭代器是不确定的.

LWG问题#446会谈明确这个问题,并建议是添加下面的文本标准(感谢@Lightness种族在轨道它带给注意):

直接或间接评估任何比较函数或二元运算符的结果,其中两个迭代器值作为从两个不同范围r1和r2(包括它们的过去值)获得的参数,这两个范围不是一个公共范围的子范围未定义,除非另有明确说明.

  • +1观察各种编译器的行为从来就不具有权威性,只应该依赖(神圣)标准,并且至少C++ 0x是准确的. (5认同)
  • 在C++ 17中仍然如此(请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#446了解原因) (2认同)