валидность итератора при move контейнера
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.02.19 15:43
Оценка:
привет.

вот есть у нас объект вектора.
вот есть у нас объект итератора для этого вектора.
и вот мы сделали move() для вектора. в каком состоянии итаратор?

казалось бы, итератор для вектора — просто указатель. и, если мы не переаллоцируем вектор — указатель быдет указывать в прежний адрес.
но, есть дебажные итераторы(говорю о libstdc++) которые не просто указатель. я, по правде сказать, не заглядывал им внтурь, наверняка они все так же хранят указатель.

вопрос в том, есть ли какие-то гарантии того, что итераторы остаются валидными при перемещении(move) контейнера? (по логике — должны быть)


спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 26.02.2019 15:44 niXman . Предыдущая версия .
Re: валидность итератора при move контейнера
От: andrey.desman  
Дата: 26.02.19 15:48
Оценка:
Здравствуйте, niXman, Вы писали:

X>вопрос в том, есть ли какие-то гарантии того, что итераторы остаются валидными при перемещении(move) контейнера? (по логике — должны быть)


Вряд ли. Допустим, итератор хранит указатель на контейнер его породивший...
Re: валидность итератора при move контейнера
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.02.19 15:48
Оценка: 1 (1)
глупый какой-то вопрос получился

https://en.cppreference.com/w/cpp/container/vector/vector

After container move construction (overload (6)), references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this. The current standard makes this guarantee via the blanket statement in §23.2.1[container.requirements.general]/12, and a more direct guarantee is under consideration via LWG 2321.

пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 26.02.2019 16:06 niXman . Предыдущая версия .
Re[2]: валидность итератора при move контейнера
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.02.19 15:49
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>Вряд ли. Допустим, итератор хранит указатель на контейнер его породивший...

ну допустим. и как это мешает?

move-ctor не выделяет память, значит он использует от породившего.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 26.02.2019 15:53 niXman . Предыдущая версия . Еще …
Отредактировано 26.02.2019 15:53 niXman . Предыдущая версия .
Re[3]: валидность итератора при move контейнера
От: andrey.desman  
Дата: 26.02.19 15:57
Оценка:
Здравствуйте, niXman, Вы писали:

AD>>Вряд ли. Допустим, итератор хранит указатель на контейнер его породивший...

X>ну допустим. и как это мешает?

Судя по тобой приведенной цитате, уже никак.

X>move-ctor не выделяет пумять, значит он использует от породившего.


То есть, итератор не может ссылаться на внутренние данные объекта. Например, std::string с фиксированным in-place буфером.
Но для std::string и нет гарантий переезда итераторов после move.
Re[4]: валидность итератора при move контейнера
От: niXman Ниоткуда https://github.com/niXman
Дата: 26.02.19 16:06
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>То есть, итератор не может ссылаться на внутренние данные объекта.

да, иначе он станет невалидным.

AD>Например, std::string с фиксированным in-place буфером.

AD>Но для std::string и нет гарантий переезда итераторов после move.

я никогда не задумывался об этом, но да, in-place буфер получается автоматический массив член класса, и если std::string создан на стеке — его не перенести. но даже если std::string создан в куче — его тоже не перенести, ибо в С++ нет возможности по адресу память понять, это стек или куча...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 26.02.2019 16:07 niXman . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.