Делает ли передача контейнеров по значению недействительными итераторы?

Вот пример кода:

#include 
#include 

template 
std::vector f(T t)
{
        std::vector v;
        for (auto i = t.begin(); i != t.end(); ++i)
        {
                v.push_back(i);
        }
        return v;
}

template 
void print(const std::vector& v)
{
        for (auto i = v.begin(); i != v.end(); ++i)
        {
                std::cout << **i << ' ';
        }
        std::cout << std::endl;
}

int main()
{
        std::vector v{1, 2, 3};
        print(f(v));
        std::vector::iterator> itervec = f(v);
        print(itervec);
}

На ideone вывод был:

1 2 3 
163487776 2 3 

Вопросы

Если я изменю f(T t)до f(T& t)результат соответствует ожидаемому. Я предполагаю, что, поскольку я работаю с копиями контейнеров, технически итераторы, которые я отталкиваю от вектора, не совпадают с вектором, который я создал в main. Это правильно? Единственное, что я заметил, это print(f(v));печатает 1 2 3, как и ожидалось, но как только я назначаю его itervec, первый итератор становится мусором, зависит ли это от реализации?

7
задан Jesse Good 11 April 2012 в 20:38
поделиться