Ответ 1
В С++ 11 splice
не приводит к недействительности итераторов, но позволяет ссылаться на соответствующие элементы в *this
контейнере. Все это описано в 23.3.5.5.
Интересно, что является основанием для создания std::list<>::splice
чтобы аннулировать итераторы, которые ссылаются на подпоследовательность, сращиваемую в новый контейнер. Это выглядит нелогично для меня, особенно в свете стандартной спецификации std::container::swap
. Согласно стандарту языка std::container::swap
не отменяет никаких итераторов. Это совершенно разумная практическая спецификация. Однако я бы сказал, что std::list<>::splice
также сильно выиграет от поведения, сохраняющего итератор.
Я понимаю, что могут быть некоторые чисто академические соображения, основанные на концепциях достижимости итератора и т.д. Но в то же время splice
является операцией std::list
-specific, а это означает, что предоставление специальной спецификации для нее, вероятно, не будет сделать серьезный концептуальный ущерб конструкции STL в целом.
Так что это было? Будет ли он объявлять вне закона или превышать некоторые практические реализации std::list
, которые я не могу распознать?
В С++ 11 splice
не приводит к недействительности итераторов, но позволяет ссылаться на соответствующие элементы в *this
контейнере. Все это описано в 23.3.5.5.
Если в контейнерах есть настроенные, неравные (не совместимые) распределители, вы не можете менять указатели, у вас нет выбора, кроме как по-настоящему копировать элементы.