2

我有这个代码:

#include <iostream>
#include <list>

int main()
{    
    typedef std::list<int> list;
    int i0t[5]={-1, 2, 3, 3, 5};
    list list_1(i0t, i0t+5);
    list::reverse_iterator ri0 = ++list_1.rbegin();    
    list_1.unique();
    list_1.remove(3);
    int val = *ri0; // why is this valid ?
    std::cout << "val = " << val << "\n";
    return 0;
}

我的直觉是 ri0 迭代器会在
list_1.unique();之后失效。
list_1.remove(3);
使用带有 _HAS_ITERATOR_DEBUGGING=1 的 MS VS2005 调试配置
但是,我认为“迭代器调试”没有抓住这一点。正确的 ?

谢谢你。

4

2 回答 2

4

我的直觉是 ri0 迭代器会变得无效

是的,它会的。根据 § 23.3.5.5

无效删除(常量 T& 值)

无效的唯一()

[...] 仅使迭代器和对已擦除元素的引用无效。

因此,您的程序的行为是未定义的。

于 2013-05-25T17:02:56.123 回答
1

23.3.5.5/15 声明对列表执行的删除操作的影响只会使迭代器和对已擦除元素的引用无效。它没有指定操作必须使那些迭代器无效。保持有效的迭代器是未指定的行为,不保证在其他实现中发生。然而,在修改后访问迭代器是未定义的行为。

于 2013-05-25T16:48:31.333 回答