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

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

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

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

2 ответа

Решение

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

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

Другие вопросы по тегам