根据C++标准(3.7.3.2/4),使用(不仅是解引用,还包括复制、转换等)无效指针是未定义的行为(如果有疑问,也可以参见此问题)。现在,遍历STL容器的典型代码看起来像这样:
std::vector<int> toTraverse;
//populate the vector
for( std::vector<int>::iterator it = toTraverse.begin(); it != toTraverse.end(); ++it ) {
//process( *it );
}
std::vector::end()
是一个指向容器中理论上的最后一个元素之后位置的迭代器。在那里没有元素,因此通过该迭代器使用指针是未定义的行为。
那么!= end()
是如何工作的呢?为了进行比较,需要构造一个包装无效地址的迭代器,然后将该无效地址用于比较,这又是未定义的行为。这种比较是否合法,为什么?