указателей в случае контейнеров STL (конкретней, std::deque). У меня такой вопрос: если операция была неуспешной, т.е. сработало исключение типа T, то ведь по стандарту контейнер останется неизменным, а значит, инвалидаций не будет?
Это надо прочитать в документации на конкретную операцию
Ну, например, возьмём вот эту: https://en.cppreference.com/w/cpp/container/deque/operator%3D
https://stackoverflow.com/questions/11699083/where-can-i-find-all-the-exception-guarantees-for-the-standard-containers-and-al Тут что-то невразумительное. Вообще ничего не сказано про инвалидацию не swap-ом.
А что там можно написать про итераторы или указатели?
Что, как ты думаешь, делает оператор = ?
Пользователю нужно скопировать данные одного дека внутрь другого. Если операция каким-то образом не удалась, возникает вопрос, правда ли, что всё осталось на месте, а итераторы сломались. Ну вдруг дек прыгнул в другое место памяти, а потом решил там остаться и удалить свои старые данные.
А с какого перепуга что-то должно ломаться в исходном, не модифицируемом контейнере?
Тот, кого присваиваем, не должен. Я не про него.
А тот КОМУ присваиваем, наоборот, гарантированно должен весь поменяться
Так, о чём я спрашиваю?
Ты бред какой-то спрашиваешь
Почему бред-то? Странный вопрос?
Бредовый. Попробуй ещё раз.
Окей. Коротко сформулирую: если оператор присваивания не сработал, итераторы не инвалидируются? Y/N?
Итераторы на какой объект?
Произвольный элемент типа T контейнера.
Блять, оператору = нужно два объекта, какого объекта итераторы тебя интересуют?
Я же писал тут, про кого я!! https://t.me/supapro/1065622
Один ты присваиваешь, другой константный. Че не ясно?
Какой же он к чёрту константный, если я ему присваиваю??
Ему неясно, что произойдет если при присваивании константного "другому" произойдет ошибка. Итераторы не-константного инвалидируются или нет?
При чём тут константные типы??? Я не писал такое слово, откуда вы его взяли?
Тот, который вы присваеваете - "константный" в том смысле, что мы его никак не изменяем. Тот, которому присваем - очевидно, изменяется
С точки зрения метода, ДА, он имеет тип константной ссылки, но прошу меня так не путать больше.
Да, именно это я и спрашивал. Неясно, почему пришлось столько времени объяснять.
Там написано про гарантии, вот Notes After container move assignment (overload (2)), unless element-wise move assignment is forced by incompatible allocators, 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 [container.requirements.general]/12, and a more direct guarantee is under consideration via LWG 2321.
Это мувающий оператор =
Про это — ничего не сказано, значит, гарантий нет.
Про остальные — ничего не сказано.
Дык то сообщение вообще Илье адресовалось. Вообще, касательно вашего вопроса, следует смотреть "стандарт" по определенному методу. Для insert deque пишут, например Exceptions If an exception is thrown when inserting a single element at either end, this function has no effect (strong exception guarantee). В остальных случаях гарантий нет.
Дык непонятно, распространяется ли этот ваш no effect на инвалидацию итераторов или нет.
has no effect это буквально ничего не произошло, контейнер не изменился
Окей, всем спасибо. Сегодня мы узнали, что no effect включает гарантию оставления итераторов валидными, а про копирующий operator= дека в стандарте пусто.
Обсуждают сегодня