Ответ 1
В соответствии со спецификацией ISO С++ 03 (см. раздел 23.1.1, таблица 67) (и как @AndyProwl упомянул в таблице 11.2.3 таблицы 11 спецификации С++ 11 ISO), поскольку часть требований последовательности, операция a.insert(p, i, j)
в контейнере последовательности имеет это предварительное условие:
i
,j
не являются итераторами вa
.
Другими словами, контейнерам последовательностей можно смело предположить, что если вы выполняете операцию вставки диапазона, этот диапазон не будет определен из итераторов над этим исходным контейнером.
В результате, если вы попытаетесь вставить элементы контейнера в себя, вы вызываете стандартную библиотечную функцию и нарушаете предварительное условие. Это приводит к поведению undefined, что означает, что он может работать на некоторых платформах, если разработчики библиотеки - хорошие люди, но это может ужасно и катастрофически потерпеть неудачу без каких-либо оправданий.
Надеюсь, это поможет!