Могу ли я безопасно и портативно использовать итераторы при перемещении списка?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Могу ли я безопасно и портативно использовать итераторы при перемещении списка?

Сообщение Anonymous »

Я не смог найти в стандарте никакой формулировки о том, что итераторы для элементов списка продолжают действовать, когда из него создается новый список, например:

Код: Выделить всё

#include [*]
#include
#include 

int main()
{
auto first = std::list{1, 2, 3};
auto it = first.begin();

auto second = std::move(first);

// Am I guaranteed that 'it' is still valid here?
while (it != second.end()) {
std::println("{}", *it++);
}
}
Конструкция Move указана как константная во времени, поэтому разумно ожидать, что она будет работать так же, как если бы она использовала splice() для повторного преобразования всего содержимого в новый список, что гарантирует, что все итераторы (кроме конечного итератора) останутся действительными итераторами для элементов нового списка.
Существует ли гарантия, что это безопасно, или мне нужно предположить, что первые итераторы признаны недействительными?
Существующие ответы дают противоречивые мнения:
  • list::iterator недействителен для перенесенного списка? говорит «Да».
  • std::list – аннулируются ли итераторы при перемещении? говорит «Нет».
Мне нужна цитата из стандарта C++, которая дает четкое решение.

Подробнее здесь: https://stackoverflow.com/questions/798 ... t-is-moved
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»