У меня есть код так же, как это:Назначения (оператор =) аннулирует итераторы для контейнеров
std::vector<int> v1 = { 1, 2, 3, 4 };
std::vector<int> v2 = { 7, 8, 9, 10 };
std::vector<int>::iterator it = std::next(v1.begin());
v1 = v2;
int test = *it;
std::cout << test;
Приведенные выше код будет сгенерирован сообщением об ошибке: итератор не разыменовываемом.
Однако, если заменить вектор со списком следующим образом:
std::list<int> v1 = { 1, 2, 3, 4 };
std::list<int> v2 = { 7, 8, 9, 10 };
std::list<int>::iterator it = std::next(v1.begin());
v1 = v2;
int test = *it;
std::cout << test;
код просто бежал, как и ожидалось, без ошибок.
От Iterator invalidation rules, и std::list::operator=, мне сказали, что после вызова оператора =, все итераторы, ссылки и указатели, связанные с этим контейнером, недействительны, за исключением концевых итераторов. Но почему работает этот код с std :: list? Не понял ли я что-то важное?
И даже если это, кажется, «работает правильно» он может сломаться в любой момент без какого-либо уведомления. –