Почему я получаю "векторные итераторы несовместимыми"?

Почему этот код

#include <algorithm>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.reserve(v.size() * 2);  // Reserve enough space to keep iterators valid
    std::copy(v.begin(), v.end(), std::back_inserter(v));
    return 0;
}

дать мне ошибку утверждения отладки, выражение: векторные итераторы несовместимы (Visual С++ 2008)?

Ответ 1

Итераторы, соответствующие элементам, становятся недействительными только при перераспределении вектора, который reserve избегает.

Однако v.end() не останется действительным.

Стандартное описание push_back и insert гарантирует, что

Вызывает перераспределение, если новый размер больше старой. Если перераспределение не происходит, все итераторы и ссылки до момента ввода остаются в силе.

v.end() не "до точки вставки".