std::list
Итераторы имеют очень приятные свойства - они остаются действительными, когда удаляется любой другой элемент, когда добавляется новый элемент и даже когда сменяется 2 списка (Iterator invalidation rules)!std :: list - являются ли итераторы недействительными при движении?
Учитывая поведение кода и что итераторы реализуются по форме указателя на фактический узел, который не изменяется при перемещении списка, я полагаю, что итераторы все еще действительны в новом контейнере, когда std::list
перемещается, но также я могу находиться в области UB здесь, обращаясь к недействительной памяти, которая на самом деле имеет «ожидаемое» значение.
std::list<int> l1{3, 2, 1};
std::list<int> l2;
auto it = std::prev(l1.end());
std::cout<<l1.size()<<" "<<l2.size()<<" "<<*it<<std::endl;
l2 = std::move(l1);
std::cout<<l2.size()<<" "<<*it<<std::endl;
3 0 1
3 1
Гарантирует ли это стандарт, если итераторы остаются в силе, когда std::list
перемещаются? Как насчет других контейнеров?
Я видел подобный вопрос раньше. C++ 11 явно не гарантирует недействительности для 'swap', но не для перемещения. Однако они, как правило, имеют такой же эффект. – zch
Я бы сказал, что они могут быть признаны недействительными с помощью другого распределителя. – Jarod42