std :: list <> :: splice аннулирует итераторы. Обоснование?

Интересно, что является основанием для создания std::list<>::splice чтобы аннулировать итераторы, которые ссылаются на подпоследовательность, сращиваемую в новый контейнер. Это выглядит нелогично для меня, особенно в свете стандартной спецификации std::container::swap. Согласно стандарту языка std::container::swap не отменяет никаких итераторов. Это совершенно разумная практическая спецификация. Однако я бы сказал, что std::list<>::splice также сильно выиграет от поведения, сохраняющего итератор.

Я понимаю, что могут быть некоторые чисто академические соображения, основанные на концепциях достижимости итератора и т.д. Но в то же время splice является операцией std::list -specific, а это означает, что предоставление специальной спецификации для нее, вероятно, не будет сделать серьезный концептуальный ущерб конструкции STL в целом.

Так что это было? Будет ли он объявлять вне закона или превышать некоторые практические реализации std::list, которые я не могу распознать?

Ответ 1

В С++ 11 splice не приводит к недействительности итераторов, но позволяет ссылаться на соответствующие элементы в *this контейнере. Все это описано в 23.3.5.5.

Ответ 2

Если в контейнерах есть настроенные, неравные (не совместимые) распределители, вы не можете менять указатели, у вас нет выбора, кроме как по-настоящему копировать элементы.