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(包括它们的过去值)获得的参数,这两个范围不是一个公共范围的子范围未定义,除非另有明确说明.