0

据我了解,以下程序

#include <map>

int main()
{
    std::map<int,int> foo;
    std::map<int,int>::iterator start = foo.begin();
    while (start++ != foo.end())
        ;
}

应该终止,但它会使用 libstdc++ 4.7.2 无限循环。该程序表现出的行为是否正确,或者标准库中是否存在错误?迭代器上 operator++(int) 的操作属性是什么?

4

1 回答 1

7

是空的map,所以第一个start++是尝试增加一个end未定义行为的迭代器。来自std::map::end()

返回指向容器最后一个元素之后的元素的迭代器。该元素充当占位符;尝试访问它会导致未定义的行为。

即使后增量start++返回 的原始值(start在这种情况下为end()),由于存在未定义的行为,期望循环终止是不合理的。

要更正,请在递增或取消引用之前检查是否start等于。foo.end()

于 2013-05-23T15:57:06.157 回答