使用std :: map :: iterator的postincrement的奇怪行为

ppa*_*lka 0 c++ iterator stl map

据我所知,以下方案

#include <map>

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

应该终止,但它使用libstdc ++ 4.7.2无限循环.此程序显示的行为是否正确,或者标准库中是否存在错误?在迭代器上运算符++(int)的操作属性是什么?

hmj*_*mjd 7

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

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

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

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

  • @ChriZzZ,但是`start`仍然被修改,这是未定义的行为.因此,在存在未定义的行为时,期望循环终止是不合理的. (2认同)