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);
using MS VS2005 Debug configuration with _HAS_ITERATOR_DEBUGGING=1
ただし、「イテレータのデバッグ」ではこれをキャッチできなかったと思います。右 ?

ありがとうございました。

4

2 に答える 2

4

私の直感は、ri0 イテレータが無効になるということでした。

はい、そうです。§ 23.3.5.5 による

void remove(定数 T& 値)

ボイドユニーク()

[...] イテレータと消去された要素への参照のみを無効にします。

したがって、プログラムの動作は未定義です。

于 2013-05-25T17:02:56.123 に答える
1

23.3.5.5/15 は、リストに対して実行された削除操作の効果は、消去された要素へのイテレータと参照のみを無効にすると述べています。操作でこれらの反復子を無効にする必要があることは指定されていません。イテレータが有効なままであることは規定の動作であり、他の実装で発生することは保証されていません。ただし、変更後のイテレータへのアクセスは未定義の動作です。

于 2013-05-25T16:48:31.333 に答える